首页 > 解决方案 > ListViewAdapter 打乱项目

问题描述

所以我有一个 listview 从基于 Room 的 SQLite 数据库中提取数据。它似乎正在读取数据,但是当页面加载时,我将获得前约 10 个条目(显示的大小),当我尝试在列表视图上向下滚动时,它会重新开始并开始获取条目再次在列表的开头。屏幕截图上的红色圆圈显示了列表的顶部和底部以及存在的重复。

public class NeighborhoodListAdapter
    extends ArrayAdapter<LivingCity> {

    private List<LivingCity> neighborhood;
    Context context;

    // View lookup cache
    private static class ViewHolder {
        TextView cityName;
    }

    public NeighborhoodListAdapter(List<LivingCity> neighborhood, Context context) {
        super(context, R.layout.object_main_citydetailsrow, neighborhood);
        this.context = context;
        this.neighborhood = neighborhood;
    }

    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        LivingCity city = getItem(position);
        ViewHolder viewHolder; 

        if (convertView == null) {

            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.object_main_citydetailsrow, parent, false);
            viewHolder.cityUid  = (TextView) convertView.findViewById(R.id.cityrow_uid);
                viewHolder.cityUid.setText(String.format(Locale.ENGLISH,"#%d", city.getUid()));
                }//city.getUid() returns an int
            }catch (Exception e){
                Log.d("editCity: ", e.toString());
            }


            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        // Return the completed view to render on screen
        return convertView;
    }
}

我开始

void loadNeighborhood() {
    neighborhoodDB = Neighborhood.getAppDatabase(this);
    neighborhood = neighborhoodDB.getNeighborhood();
}

它从数据库助手中拉出一个排序列表

public List<LivingCity> getNeighborhood() {
        List<LivingCity> neighborhood = cityDao().getAll();

        Collections.sort(neighborhood,
                new Comparator<LivingCity>() {


            @Override
            public int compare(LivingCity city1, LivingCity city2) {
                return Integer.valueOf(city1.getUid()).compareTo(city2.getUid());
            } //I thought this sort operation might be whats wrong but same error with it commented out
        });

        return neighborhood;
    }

编辑:此外,如果我反复滚动到底部而不向上,我可以欺骗它改组一些上面的项目,如屏幕截图(橙色)所示。

洗牌列表视图

标签: androidlistviewandroid-arrayadaptercustom-arrayadapter

解决方案


当您滚动ListView回收旧视图时。但是您仅在新行膨胀时才更新该值。新行的膨胀不会一直发生,它会重用旧行。这就是您再次看到旧值的原因。如下移动块下方viewHolder.cityUid.setText();的行。if-else

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // Get the data item for this position
    LivingCity city = getItem(position);
    ViewHolder viewHolder; 

    if (convertView == null) {
        viewHolder = new ViewHolder();
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.object_main_citydetailsrow, parent, false);

        viewHolder.cityUid  = (TextView) convertView.findViewById(R.id.cityrow_uid);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    //city.getUid() returns an int
    viewHolder.cityUid.setText(String.format(Locale.ENGLISH,"#%d", city.getUid()));

    // Return the completed view to render on screen
    return convertView;
}

推荐阅读