如何在ListView中的按钮上设置setOnclickListener()方法?

5

我有一个Listactivity,其中包含一个带有TextView和Button(标记为delete)的适配器。现在我想删除相应的Button点击项。 请检查代码并提供建议???

public class MySimpleArrayAdapter extends ArrayAdapter<String> implements OnClickListener {
    private final Activity context;
    private final String[] names;
    private Button deleteButton= null;
    public MySimpleArrayAdapter(Activity context, String[] names) {
        super (context, R.layout.imagelistlayout, names);
        this.context = context;
        this.names = names;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.imagelistlayout, null, true);
        deleteButton= (Button)rowView.findViewById(R.id.delete_bn);
        deleteButton.setTag(position);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        textView.setText(names[position]);
        deleteButton.setOnClickListener(this); 
        return rowView;

    }

    @Override
    public void onClick(View convertView) {
        System.out.println(deleteButton.getTag());

    }

}` 

我想知道如何删除被点击按钮对应的项目。

https://dev59.com/Z3I-5IYBdhLWcg3wf4hD - Pankaj Kumar
http://www.geekmind.net/2009/11/android-custom-list-item-with-nested.html - Pankaj Kumar
4个回答

9

只需在 getView() 方法中处理点击监听器,在其中使用 findViewById() 找到按钮即可。

这将处理当前行按钮的点击。

public class MySimpleArrayAdapter extends ArrayAdapter<String> implements OnClickListener {
    private final Activity context;
    private final String[] names;
    private Button deleteButton= null;
    public MySimpleArrayAdapter(Activity context, String[] names) {
        super (context, R.layout.imagelistlayout, names);
        this.context = context;
        this.names = names;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.imagelistlayout, null, true);
        deleteButton= (Button)rowView.findViewById(R.id.delete_bn);
        deleteButton.setTag(position);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        textView.setText(names[position]);
       deleteButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                //try to hide textview or something it may help
            }
        });
        return rowView;

    }

}`

8

您应尽量避免在getView方法中硬编码onClick处理程序,而应查看如何为listview分配一个onClick方法。在这里,您从活动中分配方法,这也是您在此处应该执行的操作。

在适配器中创建一个名为setOnXXXClickListener的方法。

public void setOnXXXClickListener(final OnClickListener onClickListener) {
    this.onXXXClickListener = onClickListener;
}

在您的getView中,将此分配给按钮,如下所示。
viewHolder.xxx.setOnClickListener(this.onXXXClickListener);

您可以从您的活动中像这样分配onClick方法:
this.adapter.setOnXXXClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d(TAG, "OnXXXClickListener");
    }
});

如果您需要调用与ListView适配器无关的某些函数,则这是一个很好的答案! - Leonardo
如何通过这种方法获取位置? - Sumit
如果您需要位置,最有可能使用setOnItemClickListener。但是,您始终可以选择在分配setOnXXXClickListener的视图上使用setTag,然后提取标记值,该值可以是位置。 - slott
你能解释一下在 this.onXXXClickListener 中的 "onXXXClickListener" 是什么吗? - Sharath
假设你的列表项包含一个购买按钮,那么它可以被命名为onBuyButtonClickListener。 - slott

0
deleteButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            Log.d("TAG", "position: " + position);
        }
    });

而且您需要在getView(final int position, ... , ...)中进行的位置到达终点 当您拥有这个位置时,可以随意对其进行操作!删除、修改或其他任何操作..


System.out.println(deleteButton.getTag()); 通过这行代码,我可以获取位置的最后一个值。假设我的列表中有三个项目,那么位置的值将为2。 - Sandroid
不使用标签,你想要的是在ListView中点击按钮的位置,对吧?那么你可以在getView中获取到该位置。如果你想删除特定的行,只需从适配器中发送的列表中删除该行,然后使用yourAdapter.notifyDataSetChanged()。 - Carnal

0
非常简单,您在getView中有一个position int变量,它引用已经膨胀按钮的项目,因此使用position变量来删除您单击的项目。只需使用以下代码即可。
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.imagelistlayout, null, true);
        deleteButton= (Button)rowView.findViewById(R.id.delete_bn);
        deleteButton.setTag(position);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        textView.setText(names[position]);
       // deleteButton.setOnClickListener(this); 
deleteButton.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                //use position here
                            // delete the item from data string havng position index and the use notifydataset
            }

        });
        return rowView;

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接