1

我正在使用 ListView 在某些行中显示 TextViews 而不是其他行。我不知道会有多少项目,它运行良好,但是当我向下滚动时,显示发生了变化。

例如: 如果我在 ListView 中有 10 个项目,而当前只有 5 个项目是可见的。适配器正确返回从 0 到 4 的位置……没关系。当我向下滚动第 10 项的位置并返回顶部时,我的所有项目看起来都像列表中的第一项,如果我滚动多次,我会让第一项重复 10 次。

我正在使用 ArrayAdapter。
这是一些代码:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        PlanningHolder holder = null;
        if (row == null) {
            row = mInflater.inflate(layoutResourceId, parent, false);

            holder = new PlanningHolder();
            holder.numberOfJour = (TextView) row.findViewById(R.id.numberDate);
            holder.lay = (LinearLayout) row.findViewById(R.id.layPlage);

            row.setTag(holder);
        } else {
            holder = (PlanningHolder) row.getTag();
        }

        if(position%2 == 1){
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

            params.setMargins(50, 5, 30, 5);
            //MarginLayoutParams marginLayoutParams = (MarginLayoutParams) params.getLayoutParams();

            //marginLayoutParams.setMargins(marginleft, 5, display.getWidth() - marginright, 5);
            TextView newplage = new TextView(context);
            newplage.setLayoutParams(params);
            newplage.setBackgroundColor(context.getResources().getColor(R.color.darkorrange));

            holder.lay.addView(newplage);
        }

        holder.numberOfJour.setText(myPlannig.getCurrent().get(Calendar.DAY_OF_MONTH) + "");

        row.setId(position);
        return row;
    }

这是我的 listView 声明:

<ListView
    android:id="@+id/list_planning"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:background="@drawable/top_shadow"
    android:scrollingCache="true"
    android:dividerHeight="1dp">
</ListView>
4

3 回答 3

3

问题是由重复使用引起的convertView。要么禁用错误优化

View row = null;

else或通过实施分支if和设置row视图来修复优化numberDatelayPlage适合这种情况。

请注意,您正在向其中添加视图,holder.lay但您永远不会删除它们。当您滚动和重用它们时,它们会累积convertView

于 2013-07-16T10:25:07.597 回答
2

这是列表视图中的常见情况。您必须正确处理 if 和 else 大小写。

例如,如果您在 if case 而不是 else case 中设置文本,则旧值将被保留。列表视图中的视图正在被回收。

当您第一次打开列表视图时,它正在被创建。

当您来回滚动时,您正在将数据加载到已经具有值的现有视图上。

无论你在 if 中处理什么getView,你都必须在 else 中撤销它。换句话说,您必须处理每种情况下的视图或代码在getView方法中流动的路径。

于 2013-07-16T10:35:19.720 回答
0

像这样设置其他条件

else
{
lay.addView(newplage);
}
于 2016-04-14T09:04:51.263 回答