【问题标题】:how to use onClickListener method of Button on a ListView如何在 ListView 上使用 Button 的 onClickListener 方法
【发布时间】:2012-07-21 10:45:37
【问题描述】:

我有一个自定义的ListView,其中包含一个Button。该按钮的功能是删除按钮。每当用户单击此按钮时,当前行将被删除。

  • 我该怎么做?
  • 如何为这个按钮设置onClickListener
  • 如何获取此按钮所在的行 ID?

提前致谢。

【问题讨论】:

  • setOnItemClickListener() 如果您只需要行 ID,则在列表视图上

标签: android button android-listview onclicklistener


【解决方案1】:

在您的自定义适配器类的getView()

buttonDelete.setOnClickListener(new OnClickListener()
{
  @Override
  public void onClick(View v)
   {
     //  Use position parameter of your getView() in this method it will current position of Clicked row button
    // code for current Row deleted...              
   }
});

【讨论】:

  • 我之前需要 findById 哪个?
【解决方案2】:

首先,您可以很容易地处理对该项目的点击。 您只需添加一个监听器:myButton.setOnClickListener(mBuyButtonClickListener)。此操作通常在您的ListViewgetView(...) 实现上完成。

您的听众可以通过使用myListView.getPositionForView(myButton) 知道按钮的项目位置。 看看这个监听器样本:

private OnClickListener mBuyButtonClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        final int position = getListView().getPositionForView(v);
        if (position != ListView.INVALID_POSITION) {
            //DO THE STUFF YOU WANT TO DO WITH THE position
        }
    }
};

完成此操作后,您应该无法处理对项目本身的点击和其他一些触摸事件传播。

因此,您应该阅读this article,它完整描述了ListView 内多个可触摸区域的使用。这将非常有帮助。

【讨论】:

    【解决方案3】:

    在适配器类的 getView 方法中使用它。

    holder.button.setOnClickListener(new OnClickListener()
    {
      @Override
      public void onClick(View v)
       {
    
       }
    });
    

    【讨论】:

      【解决方案4】:

      我到处寻找,但没有一个答案对我有帮助,直到找到。

      我所做的是创建一个 HolderView 并将我所有的文本视图和其他小部件包装在 adpater 的 getView 方法中:

      把这个类放进去:

          static class ViewHolder
      {
          TextView text1;
          TextView text2;
          TextView text3;
      }
      

      而且我通常也标定了相同的,因为它们现在是分开的:

      TextView text1;
      TextView text2;
      TextView text3;
      

      然后在 getView 中填充布局后声明所有视图和小部件:

      holder = new ViewHolder(); 
      holder.text1 = (TextView) vi.findViewById(R.id.textView2single);
      holder.text2 = (TextView) vi.findViewById(R.id.textView3single);
      holder.text3 = (TextView) vi.findViewById(R.id.textView4single);
      

      在 onClick 方法中,我使用了:

      View parentView = (View) v.getParent();
      

      然后使用这个父视图再次声明我所有的小部件:

      text1 = (TextView) parentView.findViewById(R.id.textView2single);
      text2 = (TextView) parentView.findViewById(R.id.textView3single);
      text3 = (TextView) parentView.findViewById(R.id.textView4single);
      

      这样做会强制我的 onClick 获取列表视图项的父位置,因此可以轻松调用该父项中的所有小部件,然后您可以用它做您喜欢的事情。这是我发现唯一可行的方法。

      【讨论】:

        【解决方案5】:

        创建自定义列表视图适配器,扩展 BaseAdapter 并实现 OnClickListener

        public class ListAdapter extends BaseAdapter implements OnClickListener {}
        

        覆盖 getView 方法

        @Override
        public View getView(int
                position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            View row = convertView;
            ViewHolder holder = null;
        
            if (row == null) {
                LayoutInflater inflater = (LayoutInflater) mContext
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = inflater.inflate(R.layout.list_item, parent, false);
                holder = new ViewHolder();
                holder.b1= (Button) row.findViewById(R.id.b1);
                b1.setOnClickListener(this);
            else {
        
                holder = (ViewHolder) row.getTag();
        
            }
        }
        

        现在覆盖 onclick 方法

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()) {
                case R.id.b1:
                    //button b1 click event 
                    break;
            }
        }
        
        public class ViewHolder {
            Button b1;
        }
        

        【讨论】:

          【解决方案6】:

          创建一个新的View类型变量并用currenView分配它(检查iit是否为null)。定义变量(此处采用ImageButton)并按照下面提到的方式设置viewId。

           public View getView(int position, View convertView, ViewGroup parent) {
                  View itemview=convertView;
                  if (itemview==null)
                  {
                      itemview=getLayoutInflater().inflate(R.layout.group_list,parent,false);
          
                  }
                  final group_contacts currentcontact=g_contact.get(position);
                  ImageButton delete=(ImageButton) itemview.findViewById(R.id.imgbtn_delete);
                  delete.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          //Add your code here to run on tapping button
                      }
                  });
                  return itemview;
          
          
              }
          

          【讨论】:

            【解决方案7】:

            要在ButtonListView 上使用onClickListener() 方法,您必须在AdaptergetView 方法中的按钮上应用onClickListener()

            但问题是,您将无法从getViewposition参数中获取值。

            要获得您触摸的按钮的position,您必须在您的ListView 上调用getPositionForView()方法。

            让我们用一个例子来讨论,以便更好地理解,

            • 假设您有一个ListViewnamed ExampleListview

            • 上面有一个名为ExampleButtonButton,你想在上面使用onClickListener()

              Examplebutton.setOnClickListener(new OnClickListener() {
              
                          @Override
                          public void onClick(View v) {
                      final int position= ExampleListview..getPositionForView(v);
                 /*Where 'v' is actually the 'View' object Which you are clicking.*/ 
              
              /*you can now right your code her & determine the your desired button by
                using the position parameter */
              }
              

            【讨论】:

              猜你喜欢
              • 2011-12-28
              • 2019-05-08
              • 1970-01-01
              • 2017-07-17
              • 2017-12-14
              • 2016-01-23
              • 1970-01-01
              • 1970-01-01
              • 2016-01-27
              相关资源
              最近更新 更多