【发布时间】:2012-08-10 08:19:39
【问题描述】:
所以我之前也遇到过这个问题,自然而然就在here寻求帮助。 Luksprog 的回答很棒,因为我不知道 ListView 和 GridView 如何通过回收视图优化自身。因此,根据他的建议,我能够更改将视图添加到 GridView 的方式。问题是现在我有一些没有意义的东西。这是我的getView 来自我的BaseAdapter:
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.day_view_item, parent, false);
}
Log.d("DayViewActivity", "Position is: "+position);
((TextView)convertView.findViewById(R.id.day_hour_side)).setText(array[position]);
LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.day_event_layout);
//layout.addView(new EventFrame(parent.getContext()));
TextView create = new TextView(DayViewActivity.this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 62, getResources().getDisplayMetrics()), 1.0f);
params.topMargin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());
params.bottomMargin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());
create.setLayoutParams(params);
create.setBackgroundColor(Color.BLUE);
create.setText("Test");
//the following is my original LinearLayout.LayoutParams for correctly setting the TextView Height
//new LinearLayout.LayoutParams(0, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, getResources().getDisplayMetrics()), 1.0f)
if(position == 0) {
Log.d("DayViewActivity", "This should only be running when position is 0. The position is: "+position);
layout.addView(create);
}
return convertView;
}
}
问题是当我滚动时,会发生这种情况,而不是在位置 0... 看起来像位置 6 和位置 8,加上它在位置 8 中放置了两个。现在我仍在尝试掌握使用 ListView 和 GridView 的窍门所以我不明白为什么会这样。我提出这个问题的主要原因之一是帮助其他可能不了解 ListView 和 GridView 的回收视图,或者 article 所说的方式,ScrapView 机制的人。
稍后编辑
添加到谷歌 IO 谈话的链接基本上是您了解 ListView 工作原理所需的全部内容。林克死在了cmets中。所以 user3427079 很好地更新了那个链接。 Here方便访问。
【问题讨论】:
-
哈哈,谢谢你的链接。现在开始看:)
-
您没有完全实现上一个问题中的代码示例。这个想法是你总是需要一段代码来恢复你对其他行所做的更改(在你的情况下是位置
0)。 -
嗯,我理解@Luksprog 但这是否解释了为什么它也将视图放在其他位置?如果有的话,我希望只有位置 0 有重复的视图。 Idk,仍然无法理解 ListView 是如何绑定这些东西的:/
-
回收意味着刚刚从屏幕上消失的行视图(例如位置0,向下滚动一行后)可以在以后
ListView需要显示新行时使用(如继续向下/向上滚动)。问题是刚刚消失并将在未来需要的位置使用的视图已经添加了TextView,这就是问题所在。要解决这个问题,如果getView方法被调用为除0之外的任何其他位置,则必须在getView方法中将其删除。 -
置顶帖子的链接失效了,我想是这样吗? youtube.com/watch?v=N6YdwzAvwOA
标签: android android-listview android-gridview