在Android中滚动ListView时会丢失数据

在Android中滚动ListView时会丢失数据,android,listview,Android,Listview,我正在使用ListView显示某些行中的文本视图,而不是其他行中的文本视图。我不知道会有多少项目,它运行良好,但当我向下滚动时,显示发生了变化。 例如: 如果我在ListView中有10个项目,而其中只有5个项目当前可见。适配器将位置从0正确返回到4…没关系。当我向下滚动项目10的位置并返回顶部时,我会使我的所有项目看起来像列表中的第一个项目,如果我滚动多次,则会使第一个项目重复10次 我正在使用ArrayAdapter。 这里有一些代码: @Override public View g

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

例如: 如果我在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>

该问题是由重用
convertView
引起的。或者禁用错误优化

View row = null;
或者通过执行
if
else
分支来修复优化,并针对这种情况适当地设置
视图
numberDate
layplate


请注意,您正在将视图添加到
holder.lay
,但从未删除它们。当您滚动和重用
convertView

时,它们会累积。该问题是由重用
convertView
引起的。或者禁用错误优化

View row = null;
或者通过执行
if
else
分支来修复优化,并针对这种情况适当地设置
视图
numberDate
layplate


请注意,您正在将视图添加到
holder.lay
,但从未删除它们。当您滚动和重用
convertView

时,它们会累积。这是列表视图中的常见情况。你必须正确处理“如果”和“否则”的情况

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

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

当您来回滚动时,您正在一个已有值的视图上加载数据


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

这是列表视图中的常见情况。你必须正确处理“如果”和“否则”的情况

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

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

当您来回滚动时,您正在一个已有值的视图上加载数据


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

else
{
lay.addView(newplage);
}

把其他条件像这样

else
{
lay.addView(newplage);
}

感谢您的回答,但在其他情况下,我不会在没有任何视图的情况下使用我的
holder.lay
。因此,请将它们从
holder.lay
中的
else
块中删除。感谢您的回答,但在其他情况下,我不会在没有任何视图的情况下使用我的
holder.lay
。因此,请从
else
块中的
中删除它们。