【问题标题】:Android list items are changing when scrolling滚动时Android列表项正在更改
【发布时间】:2014-10-29 03:55:53
【问题描述】:

我有一个列表,除了第一个和最后一个项目应该有不同的布局外,每个项目都应该有相同的布局。第一项正确显示了其独特的布局,但是当我在正确的一项和第一项的布局之间滚动进出视图时,最后一项发生了变化。这是我的适配器:

public class ListAdapterApp extends ArrayAdapter<App> {

    Context context;
    int layoutResourceId;
    List<App> appList;

    public ListAdapterApp(Context context, int layoutResourceId, List<App> appList) {
        super(context, layoutResourceId, appList);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.appList = appList;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        AppHolder holder = null;

        if(row == null)
        {


            holder = new AppHolder();
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            if(position == 0){
                holder.rowLayoutID = R.layout.list_column_appheaderitem;
            } else if(position == appList.size() - 1){
                holder.rowLayoutID = R.layout.list_column_appfooteritem;
            } else {
                holder.rowLayoutID = layoutResourceId;
            }
            row = inflater.inflate(holder.rowLayoutID, parent, false);//holder.packBackground = (LinearLayout)row.findViewById(R.id.packBackground);

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

        App app = appList.get(position);

        return row;
    }

    static class AppHolder
    {
        public int rowLayoutID;
    }
}

【问题讨论】:

  • 尝试使用ViewHolder方法

标签: android listview custom-lists


【解决方案1】:

问题是 ListView 在为最后一项调用 getView() 时正在回收非页脚行视图。您需要在您的适配器中实现getItemViewType()getViewTypeCount(),以向ListView 提示可以为这些项目回收哪些视图。

private static final int VIEW_TYPE_HEADER = 0;
private static final int VIEW_TYPE_FOOTER = 1;
private static final int VIEW_TYPE_DEFAULT = 2;
private static final int VIEW_TYPE_COUNT = 3;

@Override
public int getViewTypeCount() {
    // The total number of row types your adapter supports.
    // This should NEVER change at runtime.
    return VIEW_TYPE_COUNT;
}

@Override
public int getItemViewType(int position) {
    // return a value from zero to (viewTypeCount - 1)
    if (position == 0) {
        return VIEW_TYPE_HEADER;
    } else if (position == getCount() - 1) {
        return VIEW_TYPE_FOOTER;
    }
    return VIEW_TYPE_DEFAULT;
}

getView() 内部,您可以调用getItemViewType() 并使用switch 语句来构建您的行:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    switch(getItemViewType(position)) {
    case VIEW_TYPE_HEADER:
        return getHeaderView(position, convertView, parent); // TODO implement this
    case VIEW_TYPE_FOOTER:
        return getFooterView(position, convertView, parent); // TODO implement this
    case VIEW_TYPE_DEFAULT:
        return getDefaultView(position, convertView, parent); // TODO implement this
    }
}

【讨论】:

  • 您应该考虑仍然使用 viewHolder 模式,例如在getHeaderView, getFooterView 方法中防止不断地重新膨胀和重新绘制布局
【解决方案2】:

我面临同样的问题,然后我解决了这个问题,例如不检查 if (row==null) 然后实施 else 删除 if else 块并将整个代码放入您的 Getview() 方法然后运行它问题解决了。

【讨论】:

    【解决方案3】:

    您应该将if-else position 支票放在if(row == null) 的正文旁边,例如:

            if(row == null)
            {
                holder = new AppHolder();
                LayoutInflater inflater = ((Activity)context).getLayoutInflater();
    
                row = inflater.inflate(holder.rowLayoutID, parent, false);
    
                row.setTag(holder);
            }
            else
            {
                holder = (AppHolder)row.getTag();
            }
    
              if(position == 0){
                    holder.rowLayoutID = R.layout.list_column_appheaderitem;
                } else if(position == appList.size() - 1){
                    holder.rowLayoutID = R.layout.list_column_appfooteritem;
                } else {
                    holder.rowLayoutID = layoutResourceId;
                }
    

    也可以在你的constructor 中添加instance of AppHolder,比如:

    Context context;
        int layoutResourceId;
        List<App> appList;
    
    AppHolder holder;
    
        public ListAdapterApp(Context context, int layoutResourceId, List<App> appList) {
            super(context, layoutResourceId, appList);
            this.layoutResourceId = layoutResourceId;
            this.context = context;
            this.appList = appList;
    
            holder = new AppHolder();
        }
    

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,我像 this 一样解决了它。我遇到了 RadioGroup 和 Radio BUttons 的问题,但其余问题与您的问题相似。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 1970-01-01
        相关资源
        最近更新 更多