Reputation: 601
public class SettingsActivity extends AppCompatActivity {
private Context context;
private DogDatabaseHelper dbHelper;
private ListView mListView;
private ArrayList<String> names = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
setContentView(R.layout.settings);
mListView = (ListView)findViewById(R.id.listforall);
context = this;
DogDatabaseHelper dbHelper = new DogDatabaseHelper(getApplicationContext());
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select name from dog",null);
int count = cursor.getColumnIndex("name");
if(cursor.moveToFirst()){
do{
names.add(cursor.getString(cursor.getColumnIndex("name")));
}while (cursor.moveToNext());
AdapterForNames namesAdapter = new AdapterForNames(this,names);
namesAdapter.notifyDataSetChanged();
mListView.setAdapter(namesAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Intent intent = new Intent(SettingsActivity.this,SetupActivity.class);
intent.putExtra("name",names.get(position));
startActivity(intent);
}
});
}
}
This is the ListView
I'm using, but after getting database updated, I can't get my ListView
refreshed, I guess i should put some code in restart method? But not sure what to do. Any help?
Upvotes: 3
Views: 2092
Reputation: 7394
Change following code:
public class SettingsActivity extends AppCompatActivity {
private Context context;
private DogDatabaseHelper dbHelper;
private ListView mListView;
private ArrayList<String> names = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
setContentView(R.layout.settings);
mListView = (ListView)findViewById(R.id.listforall);
context = this;
DogDatabaseHelper dbHelper = new DogDatabaseHelper(getApplicationContext());
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select name from dog",null);
int count = cursor.getColumnIndex("name");
if(cursor.moveToFirst()){
do{
names.add(cursor.getString(cursor.getColumnIndex("name")));
}while (cursor.moveToNext());
AdapterForNames namesAdapter = new AdapterForNames(this,names);
namesAdapter.notifyDataSetChanged();
mListView.setAdapter(namesAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Intent intent = new Intent(SettingsActivity.this,SetupActivity.class);
intent.putExtra("name",names.get(position));
startActivity(intent);
}
});
}
}
With below code:
public class SettingsActivity extends AppCompatActivity {
private Context context;
private DogDatabaseHelper dbHelper;
private ListView mListView;
private ArrayList<String> names = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
setContentView(R.layout.settings);
context = this;
AdapterForNames namesAdapter = new AdapterForNames(this,names);
mListView = (ListView)findViewById(R.id.listforall);
mListView.setAdapter(namesAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Intent intent = new Intent(SettingsActivity.this,SetupActivity.class);
intent.putExtra("name",names.get(position));
startActivity(intent);
}
});
DogDatabaseHelper dbHelper = new DogDatabaseHelper(getApplicationContext());
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select name from dog",null);
int count = cursor.getColumnIndex("name");
if(cursor.moveToFirst()){
do{
names.add(cursor.getString(cursor.getColumnIndex("name")));
namesAdapter.notifyDataSetChanged();
} while (cursor.moveToNext());
}
}
Hope it helps!
Upvotes: 1
Reputation: 7
Register broadcast receiver like below
public class dbUpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
names.add("newly added name");
namesAdapter.notifyDataSetChanged();
}
}
IntentFilter filter = new IntentFilter("db_update_action");
registerReciever(new dbUpdateReceiver(), filter);
send this action whenever new record added like below
Intent intent=new Intent("db_update_action");
sendBroadCast(intent);
Upvotes: 0
Reputation: 7394
You are doing this wrong:
Calling below code in loop:
AdapterForNames namesAdapter = new AdapterForNames(this,names);
namesAdapter.notifyDataSetChanged();
mListView.setAdapter(namesAdapter);
Instead you should do below three tasks only once outside your loop:
1. create Adapter,
2. set it on listview,
3. setOnItemClickListener,
So move below two lines outside loop:
i.e.
AdapterForNames namesAdapter = new AdapterForNames(this,names);
mListView.setAdapter(namesAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Intent intent = new Intent(SettingsActivity.this,SetupActivity.class);
intent.putExtra("name",names.get(position));
startActivity(intent);
}
});
And inside loop you should call:
namesAdapter.notifyDataSetChanged();
Note: You only need to update the datasource after you set the Adapter on list, and notify the adapter that data is updated. Rest all is one time process.
Hope it helps!
Upvotes: 0
Reputation: 1422
Just update your list with new data( ArrayList names ) and execute this code
namesAdapter.notifyDataSetChanged();
Upvotes: 0