【问题标题】:Set on click listener to a button in a list view Android在单击侦听器上设置列表视图 Android 中的按钮
【发布时间】:2015-07-08 23:18:36
【问题描述】:

我正在为一家餐馆创建一个项目订单列表。 目标是将 onClickListener 设置为列表中每一行中的每个按钮(+/-),以便它可以计算订购了多少项目。 任何人都可以帮我处理这段代码吗?我已经设法设置了一个侦听器,但是在行中单击时它没有正确计算项目。

public class MainActivity extends ListActivity {

    private String[] item_names = {"Mozza Cheese", "Chicken Rings", "Onion Rings", "Calamari Rings"};
    private int item_counter = 1;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.view_order_list);

        listAdapter();

    }

    private void listAdapter(){
        setListAdapter(new MyAdapter(this,
                android.R.layout.simple_list_item_2, R.id.items_name_order, item_names));

    }

    private class MyAdapter extends ArrayAdapter<String> {

        public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) {
            super(context, resource, textViewResourceId, strings);

        }
        @SuppressLint("ViewHolder")
        public View getView(final int position, View convertView, ViewGroup parent) {


            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.view_order, parent, false);

            TextView item_name = (TextView) convertView.findViewById(R.id.items_name_order);
            final TextView item_count = (TextView) convertView.findViewById(R.id.count_item_order);

            Button plus = (Button) convertView.findViewById(R.id.button_plus_order);
            Button minus = (Button) convertView.findViewById(R.id.button_minus_order);

            item_name.setText(item_names[position]);

            plus.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    item_counter++;
                    item_count.setText(Integer.toString(item_counter));

                }
            });


            return convertView;
        }
    }
}

【问题讨论】:

  • 什么是view_order.xml?
  • 为什么你只有一个带计数器的int?每个item_name 应该有几个单独的计数器(可能是具有相同长度/大小的数组),是吗?此外,您仅在 OnClickListener 内为 item_count TextView 设置文本,列表将重绘,此文本将消失。你应该阅读ListView 行为(尤其是回收视图和notifyDataSetChanged() 方法)
  • 您有一个与每个项目共享的 item_counter 变量,并且您没有将项目计数保存到支持模型。

标签: android listview button row onclicklistener


【解决方案1】:

注意新的 int 数组 item_counter,在我对问题的评论中休息

public class MainActivity extends ListActivity {

    private String[] item_names = {"Mozza Cheese", "Chicken Rings", "Onion Rings", "Calamari Rings"};
    private int[] item_counter = {0, 0, 0, 0};

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.view_order_list);

        listAdapter();

    }

    private void listAdapter(){
        setListAdapter(new MyAdapter(this,
                android.R.layout.simple_list_item_2, R.id.items_name_order, item_names));

    }

    private class MyAdapter extends ArrayAdapter<String> {

        public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) {
            super(context, resource, textViewResourceId, strings);

        }
        @SuppressLint("ViewHolder")
        public View getView(final int position, View convertView, ViewGroup parent) {


            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.view_order, parent, false);

            TextView item_name = (TextView) convertView.findViewById(R.id.items_name_order);
            final TextView item_count = (TextView) convertView.findViewById(R.id.count_item_order);

            Button plus = (Button) convertView.findViewById(R.id.button_plus_order);
            Button minus = (Button) convertView.findViewById(R.id.button_minus_order);

            item_name.setText(item_names[position]);
            item_count.setText(item_counter[position];
            plus.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    item_counter[position]++;
                    notifyDataSetChanged();

                }
            });


            return convertView;
        }
    }
}

【讨论】:

  • 非常感谢它现在工作得很好,notifyDataSetChanged() 方法省去了所有的麻烦
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 2021-01-02
  • 2012-11-12
相关资源
最近更新 更多