【问题标题】:how to setOnclickListener() on the Button inside the ListView?如何在 ListView 内的 Button 上设置 OnclickListener()?
【发布时间】:2011-12-28 14:52:15
【问题描述】:

在应用程序中,我有一个 Listactivity,它有一个带有 TextView 和 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());

    }

}` 

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

【问题讨论】:

标签: android button android-listview listactivity


【解决方案1】:

只需处理 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;

    }

}`

【讨论】:

    【解决方案2】:

    您应该尽量不要在 getView 方法中对 onClick 处理程序进行硬编码,而是查看如何将 onClick 方法分配给列表视图。在这里你从活动中分配方法,这也是你应该在这里做的。

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

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

    并在您的 getView 中将其分配给按钮

    viewHolder.xxx.setOnClickListener(this.onXXXClickListener);
    

    从您的 Activity 中,您可以像这样分配 onClick 方法

    this.adapter.setOnXXXClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "OnXXXClickListener");
        }
    });
    

    【讨论】:

    • 如果您需要调用一些与列表视图适配器无关的函数,这是一个很好的答案!
    • 如何通过这种方法获得位置?
    • 如果您需要该位置,您很可能会使用 setOnItemClickListener。但是,您始终可以选择在分配 setOnXXXClickListener 的视图上使用 setTag,然后提取标签值,该值可能是位置。
    • 你能解释一下 this.onXXXClickListener 中的“onXXXClickListener”是什么吗?
    • 假设您的列表项包含一个购买按钮,那么它可能是 onBuyButtonClickListener。
    【解决方案3】:
    deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Log.d("TAG", "position: " + position);
            }
        });
    

    以及您需要在 getView 中设置到 final 的位置(final int position, ... , ...) 有了位置,就随心所欲!删除,修改或其他任何东西..

    【讨论】:

    • System.out.println(deleteButton.getTag());通过这一行,我得到了位置的最后一个值假设我的列表中有三个项目,位置的值将为 b 2。
    • 不要使用标签,你想要的是列表视图中你点击按钮的位置,对吧?然后你在getView中就有了位置。如果要删除该特定行,只需将其从您在该位置的适配器中发送的列表中删除即可。然后使用 yourAdapter.notifyDataSetChanged();
    【解决方案4】:

    非常简单,您在 getView 中有位置 int 变量,它指的是按钮已膨胀的项目,因此使用位置变量删除您单击的项目。只需使用以下代码。

    @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;
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多