【问题标题】:How do I delete an item from my custom base adapter?如何从自定义基础适配器中删除项目?
【发布时间】:2011-11-14 09:32:23
【问题描述】:

我正在扩展 BaseAdapter 以制作自定义列表视图行。我有上下文菜单,每次用户按住该行并提示他是否要删除它时都会打开。但是如何删除该行? hashmap 只是测试数据。

private MyListAdapter myListAdapter;
private ArrayList<HashMap<String, String>> items;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    items = new ArrayList<HashMap<String,String>>();
    HashMap<String, String> map1 = new HashMap<String, String>();
    map1.put("date", "10/09/2011");
    map1.put("distance", "309 km");
    map1.put("duration", "1t 45min");
    items.add(map1);

    myListAdapter = new MyListAdapter(this, items);
    setListAdapter(myListAdapter);
    getListView().setOnCreateContextMenuListener(this);
}


private class MyListAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<HashMap<String, String>> items;

    public MyListAdapter(Context context, ArrayList<HashMap<String, String>> items) {
        this.context = context;
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

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

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

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

        View view = convertView;

        if (view == null) {
            LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = layoutInflater.inflate(R.layout.row_log, null);
        }

        TextView rowLogOverview = (TextView) view.findViewById(R.id.rowLogOverview);

        HashMap<String, String> item = items.get(position);
        rowLogOverview.setText(item.get("date"));

        return view;
    }
}

【问题讨论】:

    标签: java android baseadapter


    【解决方案1】:

    您不要从适配器中删除!你从项目中删除!并且适配器位于您的项目和视图之间。从视图中您可以获得位置,并根据位置可以删除项目。然后适配器将刷新您的视图。

    这意味着你需要做这样的事情

     items.remove(position);
    adapter.notifyDataSetChanged()
    

    【讨论】:

    • 调用adapter.notifyDataSetChanged() 绑定到items 的适配器将更新listView。
    【解决方案2】:

    要删除,您需要做两件事:

    1. 在您的 ArrayList(项目)上调用 .remove()
    2. MyListAdapter 类 (mListAdapter) 的实例上调用 .notifyDataSetChanged()

    【讨论】:

      【解决方案3】:
      1. 从项目中删除项目
      2. 致电BaseAdapter.notifyDataSetChanged()。然后列表视图将被重绘,目标行将从屏幕中移除。

      【讨论】:

        【解决方案4】:

        您应该在适配器上添加一个侦听器来处理删除事件。

        public YourAdapter(Context context, List<T> rows, View.OnClickListener deleteListener) 
        { ... }
        

        然后在你的 getView() 方法上设置监听器

        yourBtn.setOnClickListener(this.deleteListener);
        

        您可以在 btn 标签上添加一个值来识别当前行:

        yourBtn.setTag(position);
        

        最后,在您的 Activity 上,您的侦听器将使用标签中的当前位置触发。然后,您可以使用之前的答案来更新您的适配器并刷新您的列表视图。

        【讨论】:

          【解决方案5】:

          在您的 BaseAdapter 中,添加代码:

          public View getView(final int position, View convertView, ViewGroup parent) {
              View v = convertView;
          
              LayoutInflater layoutInflater = LayoutInflater.from(this.context);
              v = layoutInflater.inflate(R.layout.items, null);
          
              TextView buttonDelete = (TextView) v.findViewById(R.id.buttonDelete);
              buttonDelete.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      item.remove(position);
                      notifyDataSetChanged();
                  }
              });
              return v;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-02
            • 1970-01-01
            • 2020-07-27
            • 2017-09-06
            相关资源
            最近更新 更多