我为gridview编写了一个自定义适配器。网格视图中的每个项目都有其他子视图。其中一个是textView,它实现了一个点击监听器。
当用户点击TextView时,我会显示一个Toast,它会在gridView中显示该项目的位置。
现在遇到问题:
我指定"位置"每次调用getView()时,getView()都会将其作为标记返回给TextView。当我滚动"位置"由getView()提供的是正确的值,但是一旦滚动停止,getView()提供的位置就变为0,除非我位于网格视图的顶部,否则它不应该在第一位置为零。但是,TextView标记中保存的值始终是正确的值。那是为什么?
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView == null){
convertView = mLayoutIflater.inflate(R.layout.grid_item, null);
viewHolder = new ViewHolder();
…..
viewHolder.playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(“test”, "myPos: "+ (Integer) viewHolder.mTextView.getTag()); // always returns correct position value
}
});
convertView.setTag(viewHolder);
}
else
viewHolder = (ViewHolder) convertView.getTag();
Log.e(“test”, "GETVIEW: "+ position); // position is zero when scrolling stops & correct value when scrolling
viewHolder.mTextView.setTag(position);
return convertView;
}
最好的问候
答案 0 :(得分:0)
试试这个。
convertView = mLayoutIflater.inflate(R.layout.grid_item, parent, false);
答案 1 :(得分:0)
像这样修改代码,
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView == null){
convertView = mLayoutIflater.inflate(R.layout.grid_item, null);
viewHolder = new ViewHolder();
…..
convertView.setTag(viewHolder);
}
else
viewHolder = (ViewHolder) convertView.getTag();
Log.e(“test”, "GETVIEW: "+ position); // position is zero when scrolling stops & correct value when scrolling
viewHolder.mTextView.setTag(position);
viewHolder.playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(“test”, "myPos: "+ (Integer) viewHolder.mTextView.getTag()); // always returns correct position value
}
});
return convertView;
}
答案 2 :(得分:0)
AdapterView可以在其适配器上调用getView()
,看似任意。这样做没有保证的顺序或时间。当滚动完成时,它调用方法的最后一个位置可能是0
位置是无关紧要的。使用相应的View(或其子代)缓存传递的位置值是跟踪它的正确方法。调用getView()
的最后一个位置不会告诉您与AdapterView的行为有关的任何内容,您不应该依赖它。
答案 3 :(得分:0)
适配器实际上不是定义onClickListener的地方。尝试在主Activity或任何定义的Grid中使用onItemClickListener()
作为GridView。这是更容易的方式以及应该如何完成。
总是更喜欢Android的推荐做法,而不是在课堂上进行试验。