1

ListViewのコンテキストメニューを作成します。ListViewでアイテムを長押しすると、2つのオプション(編集と削除)のあるコンテキストメニューが表示されます。私の目的は、[削除]をクリックすると、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();
        }
4

2 に答える 2

2
aptList.clear();

この行はアダプタをクリアします...したがって、すべてのアイテムが削除されます..代わりに使用します

               aptlist.remove(//the selected item);

これの代わりに

   deleteItem(info.id);

置く

  String content =getListView().getItemAtPosition(info.position);
   aptList.remove(content);
   aptList.notifyDataSetChanged();
于 2012-05-30T11:10:18.670 に答える
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();
于 2013-03-24T13:00:42.743 に答える