当我在Android中滚动ListView时,我丢失了数据

时间:2013-07-16 10:07:04

标签: android listview

我使用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>

3 个答案:

答案 0 :(得分:3)

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

View row = null;

或通过实施else的{​​{1}}分支来修复优化,并针对此案例适当设置if次观看rownumberDate

请注意,您要向layPlage添加视图,但您永远不会删除它们。当您滚动并重新使用holder.lay时,它们会累积。

答案 1 :(得分:2)

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

例如,如果在if情况下设置文本而不在其他情况下设置文本,则保留旧值。列表视图中的视图正在被回收。

首次打开列表视图时,它将被创建。

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

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

答案 2 :(得分:0)

把这样的其他条件

var parent = {};
parent.Status = "Close";
var edit = false;
var item = {};
item.Status = ""

parent.Status != 'Open' && edit || (item.Status='Retrospect');

item.Status;