Удаление элемента из Android ListView

1

Я создаю контекстное меню для ListView. При длительном нажатии элемента в ListView появится контекстное меню с двумя параметрами ("Редактирование и удаление"). Моя цель заключается в том, что при нажатии кнопки "Удалить" только выбранный элемент в ListView будет удален из списка. Но я не знаю, почему все элементы в списке удаляются, когда это делается.

Ниже приведены мои строки кода. Не могли бы вы немного помочь? Было бы неплохо, если бы вы могли дать инструкции, основанные на моем коде.

Заранее большое спасибо.

public class HistoryView extends Activity {
private static final String HISTORY_TAG = "[AppName - HistoryView] ";
private ListView mLSTHistory = null;
private ArrayList<String> lstDict = null;
private ArrayList<Integer> lstId = null;
private ArrayAdapter<String> aptList = null;
private ArrayList<String> mWordHistory = null;
private SharedPreferences prefs;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.history);
    prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

    if (prefs.getBoolean("saveHistory", true))
    {
        String strHistory = prefs.getString("history", "");
        Log.i(HISTORY_TAG, "History loaded");
        if (strHistory != null && !strHistory.equals(""))
        {
            mWordHistory = new ArrayList<String>(Arrays.asList(strHistory.split(",")));
        }
        else
        {
            mWordHistory = new ArrayList<String>();
        }
    }
    else
    {
        mWordHistory = new ArrayList<String>();
    }

    Log.d(HISTORY_TAG,"mWordHistory = " + mWordHistory.size());

    if (lstDict == null)
    {
        lstDict = new ArrayList<String>();
        lstId = new ArrayList<Integer>();
        aptList = new ArrayAdapter<String>(getApplicationContext(),R.layout.customlist);
    }
    lstDict.clear();
    lstId.clear();
    aptList.clear();
    if (mWordHistory != null && mWordHistory.size() > 0)
    {
        try
        {
            for (int i=0; i < mWordHistory.size(); i++)
            {
                Log.i(HISTORY_TAG,"item = " + mWordHistory.get(i));
                String arrPart[] = mWordHistory.get(i).split("::");
                if (arrPart.length == 3)
                {
                    //Log.i(CONTENT_TAG, "loaded content " +arrPart.length + ", wordId = " + arrPart[1]);
                    //Log.i(CONTENT_TAG, "loaded 0");
                    lstDict.add(i,arrPart[0]);
                    //Log.i(CONTENT_TAG, "loaded 1");
                    lstId.add(i,Integer.parseInt(arrPart[1]));
                    //Log.i(CONTENT_TAG, "loaded 2");
                    aptList.add(arrPart[2]);
                }
                else
                {
                    Log.i(HISTORY_TAG,"Wrong entry: " + mWordHistory.get(i));
                }
            } 
        }
        catch (Exception ex)
        {
            Log.i(HISTORY_TAG,"Wrong entry found!");
        }
    }

    mLSTHistory = (ListView) findViewById(R.id.lstHistory); 
    registerForContextMenu(mLSTHistory);
    mLSTHistory.setAdapter(aptList);

    mLSTHistory.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    {
        public void onItemClick(AdapterView<?> arg0, View v, int arg2, long arg3)
        {
            Intent i = new Intent();
            i.putExtra("dict", lstDict.get(arg2));
            i.putExtra("wordId", lstId.get(arg2));
            setResult(RESULT_OK,i);
            finish();
        }
    });
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {
        case R.id.edit:
            editItem(info.id);
            return true;
        case R.id.delete:
            deleteItem(info.id);
            return true;
        default:
            return super.onContextItemSelected(item);
    }
    }
private void deleteItem(long id) {
    // TODO Auto-generated method stub
    mWordHistory.clear();
    aptList.clear();
    mLSTHistory.setAdapter(aptList);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("history", "");
    editor.commit();
    setResult(RESULT_OK);
    finish();
    }
private void editItem(long id) {
    //Edit item...
    }
}

ОБНОВИТЬ:

Благодаря raju, теперь он работает (выбранный элемент удален из списка). Однако выбранный элемент не удаляется из SharedPreferences. Именно поэтому он появляется, когда список перезагружается.

Я использую следующие строки кода для сохранения элементов в SharedPreferences. Может ли кто-нибудь сказать мне, как обновлять SharedPreferences, чтобы он отражал изменение, когда элементы удаляются из списка с использованием строк кода raju. Спасибо Вам большое.

if (prefs.getBoolean("saveHistory", true) && mWordHistory != null && mWordHistory.size() >= 1)
        prefs =   PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        StringBuilder sbHistory = new StringBuilder();
        for (String item : mWordHistory)
        {
            sbHistory.append(item);
            sbHistory.append(",");

        String strHistory = sbHistory.substring(0, sbHistory.length()-1);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString("history", strHistory);
        editor.commit();
        }
  • 0
    Честно говоря, я очень быстро прочитал ваш код, но разве вы не очищаете полностью mWordHistory и aptList?
  • 0
    aptlist.clear () является виновником
Показать ещё 2 комментария
Теги:
sharedpreferences
listview

2 ответа

2
Лучший ответ
aptList.clear();

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

               aptlist.remove(//the selected item);

вместо этого

   deleteItem(info.id);

положил

  String content =getListView().getItemAtPosition(info.position);
   aptList.remove(content);
   aptList.notifyDataSetChanged();
  • 0
    @naju: Это тот самый! Большое спасибо за указание на это. Но как я могу получить выбранный предмет, я имею в виду конкретно? Я попробовал: aptList.remove("wordId"); но это все равно удаляет все.
  • 0
    Смотрите отредактированный ответ
Показать ещё 3 комментария
0

Я следовал за вашим советом, и в моем случае это выглядит как внизу;

Объявление адаптера в классе активности:

  private MyObjectAdapter adapter;

Адаптер создания и настройки адаптера в onCreate в классе активности:

adapter = new MyObjectAdapter(MainActivity.this, MyObject.getList(this));
setListAdapter(adapter);

getList - мой собственный метод.

Код, удаляющий элемент из списка

MyObject myObjectToRemove = (MyObject)getListView().getItemAtPosition(positionAtList);
adapter.remove(myObjectToRemove);
adapter.notifyDataSetChanged();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню