在ArrayAdapter ViewHolder缓存模式有涟漪效应

问题描述 投票:2回答:1

我一直在下面的ListView中ViewHolder模式,下面的代码。其实它工作得很好 - 但我有一个问题。

我在适配器项目布局如下:

================================================================
|    Item title                    |AddIcon|RemoveIcon|EditIcon|
================================================================

问题是这样的:当我点击RemoveIcon,代码运行后,我想RemoveIcon变色。我这样做在下面setImageResource代码的倒数第二行。现在,也能正常工作 - 图标改变。但是现在,当我滚动,在每一个特定的时间间隔(我的手机上它的8个项目),该图标也会改变。看起来在这里踢缓存?

问题:

  1. 我可以用这个缓存时的布局是对每个项目基本上属于个别?
  2. 如果我也许不能,会不会是确定使用非缓存的布局和重复每个项目?目前,我可能会在列表中100个项目。有一个更好的方法吗? public class ItemListAdapter extends ArrayAdapter<StoreItem> { static class ViewHolder { public TextView title; public ImageButton more; public ImageButton less; public ImageButton edit; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View rowView = convertView; // reuse views if (rowView == null) { LayoutInflater inflater = mContext.getLayoutInflater(); rowView = inflater.inflate(R.layout.item_layout, parent, false); ViewHolder viewHolder = new ViewHolder(); viewHolder.title = (TextView) rowView.findViewById(R.id.title); viewHolder.more = (ImageButton) rowView.findViewById(R.id.item_mas); viewHolder.less = (ImageButton) rowView.findViewById(R.id.item_menos); viewHolder.edit = (ImageButton) rowView.findViewById(R.id.item_edit); rowView.setTag(viewHolder); } final ViewHolder holder = (ViewHolder) rowView.getTag(); final StoreItem item = mItems.get(position); holder.title.setText(item.getTitle()); holder.less.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //dialog is a confirmation dialog, initialization omittted for brevity dialog.setConfirmClickListener(new View.OnClickListener() { @Override public void onClick(View v) { removeItem(item, v); holder.less.setImageResource(R.drawable.x_ok); dialog.getDialog().cancel(); } }); } });
android android-listview android-arrayadapter android-viewholder
1个回答
1
投票

物品的颜色是一种状态。当使用任何类型的缓存模式,如查看持有人模式,你必须确保设置您的意见时表示状态。

这里的问题是不是你改变绘制到R.drawable.x_ok上点击,问题是,你不占你的初始设置的未点击的状态。

首先,保存在您的Holder对象状态

public void onClick(View v) {
    removeItem(item, v);
    holder.setLessClicked(true);
    holder.less.setImageResource(R.drawable.x_ok);
    dialog.getDialog().cancel();
}

现在,只要你通过getView方法,正确运用这种状态:

final ViewHolder holder = (ViewHolder) rowView.getTag();

final StoreItem item = mItems.get(position);
holder.title.setText(item.getTitle());
if(holder.isLessClicked()){
    holder.less.setImageResource(R.drawable.x_ok);
}
else{
    holder.less.setImageResource(R.drawable.x_normal);
}

要记住的重要组成部分,是其他条件。您现在正在正确设置两种状态,点击和未点击的每一个可能行。而在此之前,你不能正确处理未点击的状态,除了您点击一个所有其他细胞。

© www.soinside.com 2019 - 2024. All rights reserved.