2016-02-04 37 views
0

我正在學習getTag和setTag。我需要解釋這些方法,並想知道它們是如何工作的。 我做了一個簡單的CustomListView有兩個按鈕和一個文本視圖。 按鈕是增加和減去增加或減少計數器的值,但問題是隻有最後一個項目值正在改變。請給我一個解決方案以及一個很好的解釋 謝謝。使用getTag和setTag來保存ListItem值

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

回答

0

在你custom listview adapter你正在嘗試實現是single item (list_items)recycling顯示,在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; 
     } 
    } 
} 

輸出enter image description here

相關問題