web-dev-qa-db-ja.com

Android:listViewとarrayAdapterからアイテムを削除する方法

ArrayListにアイテムのコレクションがあります。次のようにして、それらをカスタマーアダプターに追加します。

_this.m_adapter = new MyAdapter(this, R.layout.myitem,
    itemCart.m_items);
_

リストのこれらの各アイテムに削除ボタンがありますが、削除ボタンのonClick()をArrayListの元のアイテムに接続する方法がわかりません。誰かがこれを行う方法を説明したり、これを読むことができるチュートリアルを私に指摘したりできますか?非皮肉的/非屈辱的な応答は大歓迎です。

14
gonzobrains

これがこれまでの私の解決策です:

getView()メソッドでは、次のようにします。

_deleteButton.setTag(position);
_

getTag()はオブジェクトを返すようです。そこで、まず位置intをIntegerオブジェクトに変換しました。動作しているようです。

OnClickListener()では、次のようにします。

_items.remove(index.intValue());
_

ここまでは順調ですね。

7
gonzobrains

ArrayListremove()メソッドを呼び出すことができます

_itemCart.m_items.remove(<index of element to remove>);
this.m_adapter.notifyDataSetChanged();
_

次に、アダプタでnotifyDataSetChanged();を呼び出して、ListViewを更新する必要があります。

26
jcuenod

要素のインデックスを取得するには、リストビューが子ビュー(リストの行)のコレクションであることを単に認識します。

あなたはあなたのコードでこのようなことをすることができます:

(たとえば、getView()メソッド内)

row.setOnLongClickListener(new OnLongClickListener() 
{
    @Override
    public boolean onLongClick(View view) {
        remove(listView.indexOfChild(view));
        return true;
    }
}

つまり、解決策は、単純にindexOfChild(View)メソッドを使用して、ユーザーが(長押しして)押した子ビューのインデックスを取得することです。

7

私のために次の作品:

/* Read values from resource into an array */
String[] strColorValues =  getResources().getStringArray(R.array.colors);

ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < strColorValues.length; i++) {
    list.add(strColorValues[i]);
}

ArrayAdapter adapterColors = new ArrayAdapter(getActivity(), Android.R.layout.simple_spinner_item, list);

adapterColors.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

spinnerColors.setAdapter(adapterPermissionLevels);
spinnerColors.setOnItemSelectedListener(this);

/* Remove first element from the adapter and notify dataset changed. */
String item = spinnerColors.getItemAtPosition(0).toString();
adapterColors.remove(item);
adapterColors.notifyDataSetChanged();
3
Amit Garg

これが私のコードです。

  transfer.setItemPosition(position, items.get(position).getAddMode());

ここでの転送はメインクラスのインスタンスです。削除ボタンをクリックするたびに、この行のリスト上の項目の位置を渡します。

  public View getView(final int position, View convertView, ViewGroup parent) {
            View v = convertView;
          if (v == null) {
              final Context context = getContext();
                    LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.listviewitem_layout, null);
          }

          ItemEntry item = items.get(position);
          if (item != null) {
                    TextView textViewName = (TextView) v.findViewById(R.id.textViewItemName);
                    ImageView imageViewDelete = (ImageView) v.findViewById(R.id.imageViewDeleteIcon);

                    imageViewDelete.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {                   
                                transfer.showDialog(4);                             
                                transfer.setItemPosition(position, items.get(position).getAddMode());
                        }
                  });

          if (textViewName != null) {
                    textViewName.setText(item.getItemName());
          }

          if(imageViewDelete != null) {
              imageViewDelete.setImageResource(R.drawable.delete);
          }
      }
      return v;
        }
}
1
ロン 産

位置で削除:

mainAdapter.remove(mainAdapter.getItem(position));

最後のものなど:

mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1));
1
BaiJiFeiLong

次のように、ListViewでクリックされたアイテムのインデックス(または位置)を取得できるようです。

listview.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        listview.remove(listview.getItem(position).toString());
    }
}

したがって、ビューのクリックをリッスンし、それからインデックスを取得する必要があります。

0

コンテキストメニューを使用する場合、AdapterContextMenuInfoを取得でき、この構造はクリックされた要素のインデックスとIDを提供します。

0
Dmitriy

これらの行のコードを試してみてください、それは私にとって非常に役に立ちました

holder.image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            list.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, list.size());
        }
    });
0
Mujahid khan