【问题标题】:Using getTag and setTag to hold ListItem Values使用 getTag 和 setTag 保存 ListItem 值
【发布时间】:2016-02-04 20:41:48
【问题描述】:

我正在学习 getTag 和 setTag。我需要解释这些方法并想知道它们是如何工作的。 我制作了一个简单的 CustomListView,它有两个按钮和一个 textview。 按钮是加法和减法,增加或减少计数器的值,但问题是只有最后一个项目的值在变化。请给我一个解决方案以及一个很好的解释 谢谢。

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_items, null);
            add = (Button) convertView.findViewById(R.id.add);
            sub = (Button) convertView.findViewById(R.id.sub);
            textView = (TextView) convertView.findViewById(R.id.numberTV);
            convertView.setTag(new ViewHolder(add, sub, textView , count));
        }
        holder = (ViewHolder) convertView.getTag();
        textView = holder.textView;
        count = holder.counter;
        add = holder.add;
        sub = holder.sub;
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                count +=1;
                textView.setText(String.valueOf(count));
            }
        });
        sub.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                count -=1;
                textView.setText(String.valueOf(count));
            }
        });
        return convertView;
    }
}

class ViewHolder {

    Button add, sub;
    TextView textView;
int counter = 0;
    public ViewHolder(Button add, Button sub, TextView textView , int counter) {
        this.add = add;
        this.sub = sub;
        this.counter = counter;
        this.textView = textView;
    }
} 

【问题讨论】:

    标签: android listview baseadapter


    【解决方案1】:

    在您的custom listview adapter 中,您尝试实现的是recycling 中的single item (list_items) 中的Listview。因此,您需要对该视图使用getTagsetTag 方法。

    那么你为什么首先需要这些方法......

    1. 您正在尝试回收list_items 并在其中查看视图,为此您正在制作ViewHolder,它将在list_items 中保存视图的内部引用。
    2. 您不想调用inflater 并且每次都调用视图上的引用getView,因此您将ViewHolder's 实例保存到视图中,该实例将在不重新膨胀list_items 的情况下再次使用以及里面的引用。
    3. 通过setTag(),您可以作为对象附加到View
    4. 通过getTag(),您可以取回附加到View 的对象

    因此,每次调用 getView() 时,您都在回收 list_items 的相同初始化

    看起来工作量很大,使用RecyclerView

    您的代码解决方案...您可以在gitHub 上查看代码

    public class ListViewTestFiveActivity extends AppCompatActivity{
    
        private ListView listView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_list_view_test_five);
    
    
            initializeUI();
        }
    
        private void initializeUI() {
            listView = (ListView)findViewById(R.id.ListViewTestFiveActivity_listView);
            ArrayList<Item> items = new ArrayList<>();
    
            for (int i = 0; i < 15; i++) {
                Item item = new Item();
                item.setCount(i);
                items.add(item);
            }
    
            MyAdapter adapter = new MyAdapter(getApplicationContext(), R.layout.single_item_listview_five, items);
            listView.setAdapter(adapter);
        }
    
        private class MyAdapter extends ArrayAdapter{
    
            private ArrayList<Item> items;
            private Context a_context;
            private LayoutInflater a_layoutInflater;
    
            public MyAdapter(Context context, int resource, ArrayList<Item> items) {
                super(context, resource, items);
                this.a_context = context;
                this.items = items;
                a_layoutInflater = LayoutInflater.from(this.a_context);
            }
    
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View row = convertView;
                ViewHolder holder = null;
                if (row == null) {
                    row = a_layoutInflater.inflate(R.layout.single_item_listview_five, parent, false);
                    holder = new ViewHolder();
                    holder.plus = (Button) row.findViewById(R.id.ListViewTestFiveActivity_plus_button);
                    holder.textView = (TextView) row.findViewById(R.id.ListViewTestFiveActivity_count_textView4);
                    holder.minus = (Button) row.findViewById(R.id.ListViewTestFiveActivity_minus_button);
                    row.setTag(holder);
                } else {
                    holder = (ViewHolder) row.getTag();
                }
    
                final Item item = items.get(position);
                holder.textView.setText("" + item.getCount());
                holder.plus.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int increase_count =item.getCount();
                        item.setCount(++increase_count);
                        notifyDataSetChanged();
                    }
                });
                holder.minus.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int decrease_count =item.getCount();
                        item.setCount(--decrease_count );
                        notifyDataSetChanged();
                    }
                });
                return row;
            }
    
            private class ViewHolder{
                Button plus;
                TextView textView;
                TextView minus;
            }
        }
    
        private class Item {
            int count;
    
            public int getCount() {
                return count;
            }
    
            public void setCount(int count) {
                this.count = count;
            }
        }
    }
    

    输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2019-11-08
      • 2014-11-15
      相关资源
      最近更新 更多