【问题标题】:Removing a row from ListView with a button click通过单击按钮从 ListView 中删除一行
【发布时间】:2013-09-16 22:02:04
【问题描述】:

我有一个 ListView,它的行包含一些 TextView 和一个按钮。在用户按下按钮后,我想从 ListView 中删除包含按钮的父级。但是,如何从嵌套方法 (onClickListener) 中访问我的自定义 ArrayAdapter 字段?我只需要使用 View v。我想多次调用 v.getParent(),还是有更好的方法?

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
     ViewHolder holder = null;
     Action item = this.getItem(position);
     if (convertView == null) {
        convertView = inflater.inflate(R.layout.action_holder_layout,
              parent, false);
        holder = new ViewHolder();
        holder.title = (TextView) convertView
              .findViewById(R.id.action_holder_title);
        holder.finishBtn = (Button) convertView
              .findViewById(R.id.finish_action_button);
        convertView.setTag(holder);
     } else
        holder = (ViewHolder) convertView.getTag();
     holder.title.setText(item.getActionName());
     holder.finishBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
           //REMOVE THE ACTION FROM THE ADAPTER'S ARRAYLIST
        }
     });
     return convertView;
  }

  static class ViewHolder {

     private TextView title;
     private Button finishBtn;
  }

【问题讨论】:

    标签: android listview button onclick android-arrayadapter


    【解决方案1】:

    制作itemfinal:

    final Action item = this.getItem(position);
    

    您可以从onClick 访问它。 IMO 不是一个漂亮的解决方案,但会起作用:

    remove(item);
    

    【讨论】:

    • 它确实有效,但你说它不是最优雅的解决方案是什么意思?有更好的吗?这似乎是最简单的方式。
    • @TonyN.Tran 我不喜欢在每次调用getView 时创建View.OnClickListener。我这样做like this。它更健壮一些。
    • 好的,用你喜欢的方法,我在我的自定义 onClickListener 中实现什么?如果按下按钮,则通过 View v(按钮)。我不会将任何变量声明为最终变量,而是如何确定从哪个 ListView 行中单击了按钮?
    • 哦等等!也许我可以在按钮中存储一个标签,然后从我的自定义 onClick 中检索它!这听起来可行吗?
    • @TonyN.Tran 使用setTag 存储项目与使用final 基本相同。这些都是不错的解决方案,没有真正的缺点。只是我不喜欢在代码中的某些地方使用newgetViewonDrawonTouchEvent),因为它们可能经常被调用并导致垃圾回收。使用convertView 和持有人模式就足够了。你可以忽略我的言论;)
    【解决方案2】:

    如果您需要访问您的 ListView(及其适配器),比使用 getParent().getParent()... 更好的方法是在您的视图上使用 setTag() 方法。既然您已经使用它来插入 ViewHolder 作为视图的标记,为什么不添加另一个字段

    ListView parentListView;
    

    到您的 ViewHolder 并稍后在 onClick 中检索它?

    您也可以将 ListView 直接设置为按钮上的标签。

    由于您使用的是匿名类,因此您也可以直接从您的 onClick 代码访问适配器或其他方法和字段。

    【讨论】:

    • 你认为你能向我解释一下究竟是什么标签吗?我可以理解将 ID 整数设置为“标签”,但我不太了解 ListViews 的 setTag 和 getTag 方法。我只是从模板中学习并理解标签之外的所有内容。为什么我在 setTag() 中传递一个对象?我用 getTag() 检索什么?
    • 在视图上设置标签只是在视图中存储任意数据的便捷方式。您可以使用 setTag 存储任何对象并在以后检索相同的对象。标签没有任何作用,它们是供您根据需要使用的
    • 哦。所以他们不是为了通过标签或任何东西搜索?这似乎是与“标签”有关的最直观的事情。不过感谢您的解释!现在我只需要弄清楚我到底能用这样的东西做什么。
    • 好吧,搜索是您可以做的事情之一(我实际上忘记了这一点),但它们不仅仅用于搜索。您可以将它们用于您需要的任何目的
    猜你喜欢
    • 2015-02-03
    • 2011-04-29
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多