2017-07-24 81 views
-1

我想显示TextView项目的网格。每个人都显示文本多久被点击一次。在每个抽头上,值应该增加+1。如何将TextView绑定到动态变量?

问题:如何正确地绑定每个项目上的计数器值?

//show simple grid with textview items, each showing how many times each was clicked 
GridView grid; 

final List<AtomicInteger> items = new ArrayList<>(); 
for (int i = 0; i < 6; i++) { 
     items.add(new AtomicInteger(0)); //initialize with count=0 
} 
grid.setAdapter(MyItemAdapter(items)); 

grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     items.get(position).incrementAndGet(); 
     //TODO how to populate this to the TextView? 
    } 
}); 

如何将新计数写入TextView,以便显示更新?

它是否正确的传递计数器列表到适配器,并增加它在clicklistener内?

或者我应该在类内部的MyItemAdapter上添加clicklistener?

+0

[notifyDataSetChanged](https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged())应该重绘您的视图(在增加变量后调用它)。你为什么需要'AtomicInteger'? – Blackbelt

+0

但是,通知会导致重绘整个视图?这很糟糕,我只想重新绘制其计数器已更改的项目。我使用'AtomicInteger'来不必调用setter,只是调用getter的增量。 – membersound

+0

AdapterView 父包含所有视图查找基于位置的视图。检查我的答案 –

回答

0

父变量包含网格视图中的所有项目。 您可以通过

((TextView) parent.getChildAt(position)).setText(String.valueOf(count)); 

这在网格视图只更新单击项目找到点击项目

编辑: 如果你有设置自定义项目布局网格项目,

View itemParent = parent.getChildAt(position); 
((TextView) itemParent.findViewById(R.id.your_textview_id)).setText("count") 
+0

'parent.getChildAt(position)'在我的情况下返回'RelativeLayout'。因为clicklistener附加到'GridView'类,并且项目在该网格内。 – membersound

+0

更新了我的答案 –

+0

谢谢。这很有效,虽然它感觉有点奇怪,无法在直接连接到组件的侦听器中获取点击组件本身。但如果这是首选的方式,那好。 – membersound