2012-05-30 177 views
1

我为ListView创建了一个上下文菜单。在长按ListView中的某个项目时,将出现一个包含两个选项(编辑和删除)的上下文菜单。我的目的是当单击Delete时,只有ListView中的选定项目才会从列表中移除。但是我不知道为什么当这样做完成后,列表中的所有项目都会被删除。从Android 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... 
    } 
} 

UPDATE:

由于拉朱,现在它工作(所选项目从列表中删除)。但是,所选项目不会从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? – seth

+0

aptlist.clear()是罪魁祸首 – Orlymee

+0

call list.remove();而不是list.clear() – Shrikant

回答

3
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

查看编辑答案 – 5hssba

+0

非常感谢。我遵循你的指示如下:'String content =(String)mLSTHistory.getItemAtPosition(info.position); \t \t aptList.remove(content); \t \t aptList.notifyDataSetChanged(); \t deleteNote(info.id);'。但问题似乎在于共享首选项。我使用共享首选项保存项目,并且在应用代码时,它似乎删除项目,但该项目仍然存在于共享首选项中,并且在重新加载ListView时它会重新出现。 –

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();