2014-10-19 4 views
0

У меня есть этот списокView, который заполняется из базы данных SQL через пользовательский адаптер курсора. Когда я нажимаю на элемент, появляется диалоговое окно и запрашивает подтверждение для удаления этой записи. Если я выберем ДА, он также удалит элемент в списке и в записи SQL, а метод setListView, который я сделал, перезагружает список и прокручивает список до вершины списка. Что я хотел бы сделать, так это то, что когда я удаляю элемент, список должен помнить его позицию и показывать элементы, которые находятся рядом с этим удаленным элементом (я не хочу, чтобы он возвращался к началу списка). Как я могу это сделать?listView scroll запомнить

Вот мой код (onItemClick и setListView методы):

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

    final long arg3mod = arg3; 

    AlertDialog.Builder alertDialog = new AlertDialog.Builder(HistoryActivityMod.this); 

    // Setting Dialog Title 
    alertDialog.setTitle("Confirm Delete..."); 

    // Setting Dialog Message 
    alertDialog.setMessage("Are you sure you want delete this?"); 

    alertDialog.setIcon(android.R.drawable.ic_menu_delete); 

    // Setting Positive "Yes" Button 
    alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog,int which) { 

      db.delete(DbHelper.TABLE_NAME, DbHelper.C_ID+"="+arg3mod, null); 
      setListView(); 

     Toast.makeText(getApplicationContext(), "Entry was deleted", Toast.LENGTH_SHORT).show(); 

     } 
    }); 


    // Setting Negative "NO" Button 
    alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 

     Toast.makeText(getApplicationContext(), "Nothing changed", Toast.LENGTH_SHORT).show(); 
     dialog.cancel(); 
     } 
    }); 

    // Showing Alert Message 
    alertDialog.show(); 

} 

public void setListView(){ 
    String[] columns= {DbHelper.C_ID, DbHelper.ROW1, DbHelper.ROW2, DbHelper.ROW3, DbHelper.ROW4, DbHelper.ROW5}; 

    Cursor cursor = db.query(DbHelper.TABLE_NAME, columns, null, null, null, null, "_id DESC"); 

    CustomCursorAdapter adapter = new CustomCursorAdapter(getApplicationContext(),cursor, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

    lv.setAdapter(adapter); 

} 

ответ

1

Попробуйте следующее:

public void setListView(){ 
    String[] columns= {DbHelper.C_ID, DbHelper.ROW1, DbHelper.ROW2, DbHelper.ROW3, DbHelper.ROW4, DbHelper.ROW5}; 

    Cursor cursor = db.query(DbHelper.TABLE_NAME, columns, null, null, null, null, "_id DESC"); 
    if(lv.getAdapter() == null) { 
     CustomCursorAdapter adapter = new CustomCursorAdapter(getApplicationContext(),cursor, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 
     lv.setAdapter(adapter); 
    } else { 
     ((CustomCursorAdapter)lv.getAdapter()).changeCursor(cursor); 
    } 

} 
0

Проблема заключается в том, что вы называете lv.setAdapter(adapter), это приводит список сброса к началу. Вы можете lv.setAdapter(adapter) только один раз, и если ваш адаптер является CursorAdapter, вы можете использовать его метод changeCursor(cursor), чтобы обновить его данные для подкладки.

Таким образом, в вашем методе setListView() вы можете заменить lv.setAdapter(adapter) на adapter.changeCursor(cursor).

Ссылки: https://developer.android.com/reference/android/widget/CursorAdapter.html#changeCursor(android.database.Cursor)

+0

Я изменил его, но ListView не загружаются. Где в коде следует вызвать lv.setAdapter (адаптер)? – Markonionini

+0

После создания адаптера. –

+0

Может быть, мне что-то не хватает, но это не работает для меня. – Markonionini

Смежные вопросы