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()
的原因是,否则回收的视图不会使用正确的数据绑定进行更新。
这是我第一次使用列表视图,如有初学者错误,请提前谅解。
我的自定义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()
的原因是,否则回收的视图不会使用正确的数据绑定进行更新。