Android, обновить список после нажатия на элемент списка

У меня есть одна небольшая проблема: после того, как я нажимаю на элемент списка, флажок на элементе не меняет состояние. Обновление работает отлично, возможно, setChecked, но изменения появятся после выхода и повторного запуска активности. Я много читал про notifyDataSetChange(), может и работает, но нет. Как я могу это исправить, например, после нажатия на элемент значение chechbox изменится.

public class SviatokPridajActivity extends Activity 
{   
private DatabaseOp mDbHelper;
ListView listview;
String username;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sviatok_pridaj);

    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    listview = (ListView) findViewById(R.id.listSviatok);

    showUserSettings(); 

    mDbHelper = new DatabaseOp(this);
    mDbHelper.open();

    Cursor sviatokCursor = mDbHelper.fetchAllSviatokNastav(username, 3);

    if (sviatokCursor.getCount()==0)
    {
        mDbHelper.naplnSviatky(username);
        sviatokCursor = mDbHelper.fetchAllSviatokNastav(username, 3);
    }

    final SviatokCursorAdapter adapter = new SviatokCursorAdapter(this, sviatokCursor);
    listview.setAdapter(adapter);

    listview.setOnItemClickListener(new OnItemClickListener() 
    {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int stlpec, long arg3) 
        {
            // TODO Auto-generated method stub
            Cursor cur = (Cursor) adapter.getItem(stlpec);
            String odosli = cur.getString(cur.getColumnIndex("_id"));
            String zobraz = cur.getString(cur.getColumnIndex("dlzka"));

            CheckBox check = (CheckBox)findViewById(R.id.checkBox);

            if (Integer.parseInt(zobraz)==0)
            {
                mDbHelper.updateSviatok(odosli, username, 1);
            } else {
                mDbHelper.updateSviatok(odosli, username, 0);
            }

            check.setChecked(!check.isChecked());

            adapter.notifyDataSetChanged();
        }
    });
}

@Override
public void onPause() 
{
    super.onPause();
    mDbHelper.close();
}

private void showUserSettings() 
{
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    username = sharedPrefs.getString("prefUsername", "NULL");
}
}

person Tomino    schedule 16.04.2014    source источник
comment
ты обновил адаптер?   -  person Ersin Gülbahar    schedule 16.04.2014


Ответы (4)


вы проверили свой CheckBox в itemclick, но он не отражается в вашем itemList, поэтому перед вызовом adapter.notifyDataSetChanged(); вам нужно обновить listItems с новыми изменениями.

person maddy d    schedule 16.04.2014

Я ответил на этот вопрос следующим образом: https://stackoverflow.com/a/22954806/1332870 вы можете это проверить? если это не решит вашу проблему, пожалуйста, дайте мне знать

person Ersin Gülbahar    schedule 16.04.2014
comment
вы должны добавить новые элементы и установить свой адаптер, а затем использовать notifyDataSetChanged - person Ersin Gülbahar; 16.04.2014

Перезагрузите Cursor и вместо adapter.notifyDataSetChanged(); используйте adapter.changeCursor(reloadedCursor);

person isah    schedule 16.04.2014
comment
что такое reloadedCursor или что я должен изменить? - person Tomino; 16.04.2014
comment
Cursor reloadedCursor= mDbHelper.fetchAllSviatokNastav(username, 3); затем adapter.changeCursor(reloadedCursor); - person isah; 16.04.2014

Не уверен, что это нагрузка на основной поток, но вы можете просто снова установить адаптер в методе щелчка.

person Michael Chav    schedule 26.05.2015