Ben
Ben

Reputation: 601

How to update ListView after updating database?

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

Answers (4)

Shridutt Kothari
Shridutt Kothari

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

sandeep
sandeep

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

Shridutt Kothari
Shridutt Kothari

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

Rahul
Rahul

Reputation: 1422

Just update your list with new data( ArrayList names ) and execute this code

namesAdapter.notifyDataSetChanged();

Upvotes: 0

Related Questions