【问题标题】:I lose Data when i scroll my ListView in Android我在 Android 中滚动 ListView 时丢失了数据
【发布时间】:2016-04-14 17:04:51
【问题描述】:

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

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

【问题讨论】:

    标签: android listview


    【解决方案1】:

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

    View row = null;
    

    或通过实现ifelse 分支来修复优化,并针对这种情况适当地设置row 视图numberDatelayPlage

    请注意,您正在向holder.lay 添加视图,但您从未删除它们。它们在您滚动和重复使用 convertView 时累积。

    【讨论】:

    • 感谢您的回答,但在其他情况下,我不会在没有任何意见的情况下使用我的 holder.lay
    • 所以将它们从holder.lay 中的else 块中删除。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      像这样设置其他条件

      else
      {
      lay.addView(newplage);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 2020-12-30
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 1970-01-01
        相关资源
        最近更新 更多