我有一个带有自定义列表适配器的 ListView。在 getView() 方法中,我正在使用 ViewHolder '模式',如 ListView14.java 的 API 演示中所示。当我第一次渲染列表时,它似乎加载正确。但是,我遇到的问题是,当我滚动列表时,我看到列表的数据显示在错误的行中(例如,应该在第 10 行中的 TextView 显示在第 2 行中)。但是,当我不使用查看器,而是每次调用 findViewById() 时,列表视图会正确呈现。
问问题
6684 次
3 回答
10
但是,我遇到的问题是,当我滚动列表时,我看到列表的数据显示在错误的行中(例如,应该在第 10 行中的 TextView 显示在第 2 行中)。
最有可能的是,您不正确地回收了您的行,因此ViewHolders
您正在操作的行不是您要返回的行的正确行。
这是我的一本书的免费摘录,其中详细介绍了行回收——也许它会帮助您确定哪里出了问题。
于 2010-07-08T23:52:55.807 回答
2
- 我遇到了同样的问题
- 使用以下技术解决
- 原因:适配器未经常加载。
在您的自定义适配器类中使用访问说明符添加 ViewHolder
private static class ViewHolder { protected TextView itemName; }
在获取视图方法中
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
// create a ViewHolder reference
ViewHolder holder;
//check to see if the reused view is null or not, if is not null then reuse it
if (view == null) {
holder = new ViewHolder();
view = mLayoutInflater.inflate(R.layout.list_item, null);
holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view);
// the setTag is used to store the data within this view
view.setTag(holder);
} else {
// the getTag returns the viewHolder object set as a tag to the view
holder = (ViewHolder)view.getTag();
}
// now Use Holder object toget Idss
holder.itemName.setText(" sample text based on position ");
}
重要提示:我们不应该为视图对象设置任何标签,除了 Viewholder 对象
于 2013-07-05T09:35:50.047 回答
1
所以我想我在这里发现了真正的问题。当您为每一行动态设置布局参数时,您需要确保针对所有条件执行此操作。我的问题是,如果它是第一行,我设置了一个布局参数(如填充或边距等),但如果它是中间行,我没有明确设置这些参数,认为它只会使用膨胀的东西由视图充气机。这解释了为什么当我每次都放大视图时它会起作用。这是之前和之后:
前:
if (position == 0) {
layoutParams.topMargin = uiHelper.getDip(15.0f);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
RelativeLayout.TRUE);
holder.actionMenu.setLayoutParams(layoutParams);
holder.contentLayout.setBackgroundResource(R.drawable.top_row);
} else if (position == posts.size() - 1) {
holder.contentLayout
.setBackgroundResource(R.drawable.bottom_row);
holder.contentLayout.setPadding(holder.contentLayout
.getPaddingLeft(),
holder.contentLayout.getPaddingTop(),
holder.contentLayout.getPaddingRight(),
holder.contentLayout.getPaddingBottom() + uiHelper.getDip(10.0f));
} else {
holder.contentLayout
.setBackgroundResource(R.drawable.inner_row);
}
之后:`
layoutParams.topMargin = uiHelper.getDip(10.0f);
holder.contentLayout.setPadding(holder.contentLayout
.getPaddingLeft(),
holder.contentLayout.getPaddingTop(),
holder.contentLayout.getPaddingRight(),
uiHelper.getDip(10.0f));
if (position == 0) {
layoutParams.topMargin = uiHelper.getDip(15.0f);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
RelativeLayout.TRUE);
holder.contentLayout.setBackgroundResource(R.drawable.top_row);
} else if (position == posts.size() - 1) {
holder.contentLayout
.setBackgroundResource(R.drawable.bottom_row);
holder.contentLayout.setPadding(holder.contentLayout
.getPaddingLeft(),
holder.contentLayout.getPaddingTop(),
holder.contentLayout.getPaddingRight(),
uiHelper.getDip(20.0f));
} else {
holder.contentLayout
.setBackgroundResource(R.drawable.inner_row);
}
holder.actionMenu.setLayoutParams(layoutParams);
于 2010-07-09T14:08:48.280 回答