【问题标题】:ListView remove item from custom BaseAdapterListView 从自定义 BaseAdapter 中删除项目
【发布时间】:2016-03-18 05:42:42
【问题描述】:

我有以下BaseAdapter 类:

public class ListViewAdapter extends BaseAdapter{
String [] result, players;
Context context;
View rowView;
int [] imageId;
Holder holder;
private static LayoutInflater inflater=null;
public ListViewAdapter(MainActivity.PageFragment mainActivity, String[] prgmNameList, String[] players, int[] prgmImages) {
    result=prgmNameList;
    this.players=players;
    context=mainActivity.getContext();
    imageId=prgmImages;
    inflater = ( LayoutInflater )context.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
    return result.length;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

public class Holder
{
    TextView title, players;
    ImageView img;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
    // TODO Auto-generated method stub
    holder=new Holder();
    rowView = inflater.inflate(R.layout.server_layout, null);
    holder.title=(TextView) rowView.findViewById(R.id.textView1);
    holder.players=(TextView) rowView.findViewById(R.id.textView5);
    holder.img=(ImageView) rowView.findViewById(R.id.imageView7);
    holder.title.setText(result[position]);
    holder.players.setText(players[position]);
    holder.img.setImageResource(imageId[position]);
    rowView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(final View v) {
            new AlertDialog.Builder(context)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setTitle("Remove")
                    .setMessage("Are you sure you want to remove this server?")
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(context, "You LongClicked " + result[position], Toast.LENGTH_LONG).show();
                            //REMOVE ITEM
                            notifyDataSetChanged();
                        }
                    })
                    .setNegativeButton("No", null)
                    .show();
            return false;
        }
    });
    return rowView;
 }
}

还有以下onCreate()

            ListView servers =(ListView) view.findViewById(R.id.list_view);
            BaseAdapter e = new ListViewAdapter(this,prgmNameList,players,prgmImages);
            servers.setAdapter(e);

我的问题是,如何在 onClick 方法中删除点击的项目。我试图从ListViewrowView=null; 中删除它,但这些都不起作用。提前致谢

【问题讨论】:

  • 您是如何尝试将其从列表视图中删除的?
  • 可以将其从对象中移除,然后刷新列表视图
  • @Slavik servers.removeViewAt(position); 但出现错误“AdapterView 不支持 removeViewAt(int)”
  • @NOT_A_PROGRAMMER 来自哪个对象?
  • 你试过servers.removeView(rowView)吗?

标签: android listview baseadapter listviewitem


【解决方案1】:

在 ListViewAdapter 中定义一个名为 removeRow 的方法。

public void removeRow(int position) {
    // Remove the element from the results array here.
    notifyDataSetChanged();
}

一些建议:如果可以,请使用 RecyclerView。该框架有更好的方法来处理删除动画等。 请在 getView() 中使用 convertView。不要为每次调用 getView 增加新视图。它会让你的 listView 更快。

【讨论】:

  • result 数组是改变我的项目 UI 的 3 个(其他:playersimageId)数组之一。此外,即使我将它们全部设置为 null(因为没有 remove() 方法),使相应的文本图像视图为空,背景仍然存在
  • 我想建议您使用列表而不是数组。您还可以定义一个对象来保存与每一行相关的所有数据,例如此类 RowData { int imageId;字符串播放器,结果;并有一个 List 作为数组的数据成员。列表行数据;现在您可以毫无问题地删除项目。
【解决方案2】:

如果 removeViewAt() 给您一个错误,那么只需获取单击项目的位置并将其从您的数组列表中删除。然后说 adapter.notifyDataSetChanged();视图会自行更新。

【讨论】:

    【解决方案3】:

    从适配器内的列表中删除项目后,尝试在适配器中执行以下操作:

    this.notifyItemRemoved(position);
    

    当 position 是被移除项的位置时。

    【讨论】:

    • 你这样做的方式是对你的列表执行删除操作 -> list.remove(position) 并调用 adapter.notifyItemRemoved(position)。这是最有效的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多