如何在ListView上使用Button的onClickListener方法

时间:2012-07-21 10:45:37

标签: android button android-listview onclicklistener

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

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

提前致谢。

7 个答案:

答案 0 :(得分: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...              
   }
});

答案 1 :(得分:4)

首先,您可以轻松处理此项目的点击。 您只需添加一个侦听器:myButton.setOnClickListener(mBuyButtonClickListener)。此操作通常在getView(...)的{​​{1}}实施中完成。

您的听众可以使用ListView了解按钮的项目位置。 看看这个听众样本:

myListView.getPositionForView(myButton)

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

因此,您应该阅读this article,其中详细描述了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 } } }; 内多个可触摸区域的使用。这将非常有帮助。

答案 2 :(得分:1)

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

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

   }
});

答案 3 :(得分:1)

我到处寻找,没有答案帮助我,直到有人做到了。

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

答案 4 :(得分: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;
}

答案 5 :(得分: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;


    }

答案 6 :(得分:0)

要在onClickListener()的{​​{1}}上使用Button方法,您必须ListView onClickListener() {{}上的按钮Adapter 1}} Methode。

但问题是,您将无法从getView的{​​{1}}参数中获取值。

要获取已触摸的按钮的position,您必须在getView上调用position方法。

让我们讨论一个更好理解的例子,

  • 假设您有一个名为getPositionForView()

  • ListView
  • 其上的ListView名为ExampleListview,您想在其上使用Button

    ExampleButton