5

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

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

提前致谢。

4

7 回答 7

7

在您的自定义适配器类的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...              
   }
});
于 2012-07-21T10:48:20.550 回答
4

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

您的听众可以通过使用 了解按钮的项目位置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
        }
    }
};

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

因此,您应该阅读这篇完整描述在ListView. 这将非常有帮助。

于 2012-07-22T00:14:52.380 回答
1

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

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

   }
});
于 2012-07-21T11:11:27.517 回答
1

我到处看了看,没有一个答案对我有帮助,直到有一个答案。

我所做的是创建一个 HolderView 并将我所有的 textviews 和其他小部件包装在 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 获取列表视图项的父位置,因此可以轻松调用该父项中的所有小部件,然后您可以使用它做您喜欢的事情。这是我发现的唯一可行的方法。

于 2013-08-21T23:42:04.117 回答
0

创建一个新的 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;


    }
于 2015-04-06T05:35:05.843 回答
0

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

但问题是,您将无法从 的position参数中获取值getView

要获取position您已触摸的按钮,您必须调用getPositionForView()您的ListView.

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

  • 考虑你有一个ListView名为ExampleListview

  • 上面有一个Button名字ExampleButton,你想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 */
    }
    
于 2015-04-19T12:23:41.500 回答
0

创建自定义列表视图适配器,扩展 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;
}
于 2014-07-25T17:21:21.333 回答