ArrayListにアイテムのコレクションがあります。次のようにして、それらをカスタマーアダプターに追加します。
_this.m_adapter = new MyAdapter(this, R.layout.myitem,
itemCart.m_items);
_
リストのこれらの各アイテムに削除ボタンがありますが、削除ボタンのonClick()
をArrayListの元のアイテムに接続する方法がわかりません。誰かがこれを行う方法を説明したり、これを読むことができるチュートリアルを私に指摘したりできますか?非皮肉的/非屈辱的な応答は大歓迎です。
これがこれまでの私の解決策です:
getView()
メソッドでは、次のようにします。
_deleteButton.setTag(position);
_
getTag()
はオブジェクトを返すようです。そこで、まず位置intをIntegerオブジェクトに変換しました。動作しているようです。
OnClickListener()
では、次のようにします。
_items.remove(index.intValue());
_
ここまでは順調ですね。
ArrayList
でremove()
メソッドを呼び出すことができます
_itemCart.m_items.remove(<index of element to remove>);
this.m_adapter.notifyDataSetChanged();
_
次に、アダプタでnotifyDataSetChanged();
を呼び出して、ListViewを更新する必要があります。
要素のインデックスを取得するには、リストビューが子ビュー(リストの行)のコレクションであることを単に認識します。
あなたはあなたのコードでこのようなことをすることができます:
(たとえば、getView()メソッド内)
row.setOnLongClickListener(new OnLongClickListener()
{
@Override
public boolean onLongClick(View view) {
remove(listView.indexOfChild(view));
return true;
}
}
つまり、解決策は、単純にindexOfChild(View)メソッドを使用して、ユーザーが(長押しして)押した子ビューのインデックスを取得することです。
私のために次の作品:
/* 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();
これが私のコードです。
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;
}
}
位置で削除:
mainAdapter.remove(mainAdapter.getItem(position));
最後のものなど:
mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1));
次のように、ListViewでクリックされたアイテムのインデックス(または位置)を取得できるようです。
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listview.remove(listview.getItem(position).toString());
}
}
したがって、ビューのクリックをリッスンし、それからインデックスを取得する必要があります。
コンテキストメニューを使用する場合、AdapterContextMenuInfoを取得でき、この構造はクリックされた要素のインデックスとIDを提供します。
これらの行のコードを試してみてください、それは私にとって非常に役に立ちました
holder.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, list.size());
}
});