单击 ArrayAdapter 中的图像以删除列表视图中的项目

Posted

技术标签:

【中文标题】单击 ArrayAdapter 中的图像以删除列表视图中的项目【英文标题】:Click on image inside ArrayAdapter to remove item in listview 【发布时间】:2015-04-30 15:38:34 【问题描述】:

我有片段...

    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() 【参考方案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);

【讨论】:

以上是关于单击 ArrayAdapter 中的图像以删除列表视图中的项目的主要内容,如果未能解决你的问题,请参考以下文章

如何实现 Asynctask 在 ArrayAdapter 中加载图像

如何使用 ArrayAdapter 在 ArrayList 中的 ListView 中显示项目(图像的路径)?

连续按钮的自定义arrayadapter和onclicklistener

在android中使用arrayadapter类自定义listview

使用 ArrayAdapter 的 ListView 中的按钮

ArrayAdapter 更新列表 - 没有按预期工作?