【问题标题】:Click on image inside ArrayAdapter to remove item in listview单击 ArrayAdapter 中的图像以删除列表视图中的项目
【发布时间】:2025-11-28 17:35:01
【问题描述】:

我有片段...

    public class MyFragment extends Fragment {...

调用适配器...

    MyArrayAdapter adapter = new MyArrayAdapter...
    my.setAdapter(adapter);

适配器有删除项目的图像。我可以收听图像点击,但无法从片段中的列表视图中删除项目。

public class MyArrayAdapter extends ArrayAdapter<String> {...

public View getView(final int position, View convertView, ViewGroup parent) {...

    ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
    imageView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
        // ???????????
        ...}

【问题讨论】:

  • 简单地从适配器的数据中删除对象并在ImageView's onClick()中调用适配器的notifyDatasetChnaged()
  • 如何访问适配器?
  • 你在适配器类,只需使用.this调用
  • 在 imageView onClick 上使用“this”...我不太明白。对不起。
  • @Arnes 你的班级extends ArrayAdapter&lt;String&gt;。你可以使用MyArrayAdapter.this.notifyDatasetChnaged()

标签: android arraylist fragment adapter


【解决方案1】:

因为您的点击位于OnClickListener 内部类中,您必须指定MyArrayAdapter.this 才能从点击侦听器内部访问适配器的功能。如果您只使用this,您将引用OnClickListener,并且只能访问该类上的方法。

像这样:

public View getView(final int position, View convertView, ViewGroup parent) {

    ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
    imageView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            MyArrayAdapter.this.remove(getItem(position));
            MyArrayAdapter.this.notifyDataSetChanged();
        }
}

【讨论】:

  • 这个应用程序也崩溃了:(
  • 02-27 21:25:31.781: E/AndroidRuntime(11332): 致命异常: main 02-27 21:25:31.781: E/AndroidRuntime(11332): java.lang.UnsupportedOperationException 02 -27 21:25:31.781: E/AndroidRuntime(11332): 在 java.util.AbstractList.remove(AbstractList.java:638) 02-27 21:25:31.781: E/AndroidRuntime(11332): 在 java.util .AbstractList$SimpleListIterator.remove(AbstractList.java:75) 02-27 21:25:31.781: E/AndroidRuntime(11332): at java.util.AbstractCollection.remove(AbstractCollection.java:229) 02-27 21:25 :31.781: E/AndroidRuntime(11332): 在 android.widget.ArrayAdapter.remove(ArrayAdapter.java:244)
  • 这可能是因为您使用数组初始化适配器,即:String[] 而不是列表,即:ArrayList。如果没有看到整个 MyArrayAdapter 构造函数,就很难判断。
【解决方案2】:

我已经很久没有做Java了,但我记得你可以用这个:

this.remove(position);
this.notifyDataSetChanged();

【讨论】:

  • 这是当前对象,您正在调用一个可能尚未初始化也可能尚未初始化的静态对象,可能还没有。
【解决方案3】:

您可以在适配器中编写一个方法:

private boolean removeItemByPosition(int position){
    try{
        items.remove(position);
        this.notifyDataSetChanged();
        return true;
    } catch (Exception e){
        e.printStackTrace();
        return false;
    }   
}

在某些情况下,notifyDataSetChanged() 方法不起作用,请尝试重新设置ListView Adapter,您应该可以在Fragment 中执行此操作。

【讨论】:

    【解决方案4】:

    只需拨打convertView.setVisibility(View.GONE);

    【讨论】:

      最近更新 更多