Android 如果我不 re-query 来自数据库的所需信息,ListView 行会重复

Android ListView rows are repeating if i don't re-query the needed info from the database

这是我第一次使用列表视图,如有初学者错误,请提前谅解。

我的自定义getView代码如下:

public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder mHolder;
    if (convertView == null) {
        /*Toast toast = Toast.makeText(context, "nullConvertView", Toast.LENGTH_SHORT);
        toast.show();*/
        mHolder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.listitem, parent, false);


        mHolder.PetName = (TextView) convertView.findViewById(R.id.PetName);

        mHolder.PetImage = (RoundedImageView) convertView.findViewById(R.id.PetImage);



        updateItem(mHolder, this.getItem(position));

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

    return convertView;
}

updateItem 函数连接到一个dropbox datastore 并检索数据存储标题和图像等信息(listview 中的每一行都是一个dropbox datastore),然后通过mHolder.PetName.setText(queriedresultstring) ecc

如果我以这种方式保留代码,滚动时会重复查看,而如果我将 updateItem 函数移到 if/else 条件之外,一切正常,但每次滚动列表视图时,它都会再次查询数据库对于重新出现在屏幕上的每一行。

有什么方法可以将信息保存在视图中,而不必每次在屏幕上显示视图 returns 时都查询数据库?

谢谢

与其在您的 updateItem() 方法中查询数据库,不如使用 Loader 查询数据并构建用于支持您的适配器的本地数据存储(例如 ArrayList.) 或者,您可以使用 Loader 查询后端,将数据缓存在本地数据库中,因此您的 Loader 必须具有使用本地数据库的逻辑,而不是提交新的查询(如果可能的话。)由您决定如何管理它。

顺便说一句,您需要在 if/else 条件检查之外进行当前 updateItem() 的原因是,否则回收的视图不会使用正确的数据绑定进行更新。