Java 如何编写有效的适配器行缓存
如果您查看下面的代码,当i control v为null或不为null时,不需要重新调整视图,则listview存在问题 当我滚动listview时,行值会改变,重复。我可以通过删除**”if(null==v){“**”来解决这个问题。但此时,当我滚动listview时,它会闪烁Java 如何编写有效的适配器行缓存,java,android,adapter,Java,Android,Adapter,如果您查看下面的代码,当i control v为null或不为null时,不需要重新调整视图,则listview存在问题 当我滚动listview时,行值会改变,重复。我可以通过删除**”if(null==v){“**”来解决这个问题。但此时,当我滚动listview时,它会闪烁 if (null == v) { v = inflater.inflate(layoutId, parent, false); // view invoke edilir invokeView(v); v.setTag
if (null == v) {
v = inflater.inflate(layoutId, parent, false);
// view invoke edilir
invokeView(v);
v.setTag(viewHolder);
} else {
viewHolder = (T) v.getTag();
}
谢谢你的帮助
所有代码如下
适应性
public interface Adaptable {
public View buildView(View v, LayoutInflater inflater, ViewGroup parent,Context context, int position);
public Object returnEntity();
}
BaseView
public abstract class BaseView<T, E> implements Adaptable,IMapView {
private static final String TAG = "BaseView";
protected int layoutId;
protected T viewHolder;
protected E entity;
public BaseView() {
}
public BaseView(E entity, int layoutId) {
this.entity = entity;
this.layoutId = layoutId;
}
protected void invokeView(View v) {
try {
Field fs[] = viewHolder.getClass().getFields();
for (Field f : fs) {
InvokeView a = (InvokeView) f.getAnnotation(InvokeView.class);
int id = a.viewId();
f.set(viewHolder, v.findViewById(id));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
@SuppressWarnings("unchecked")
@Override
public View buildView(View v, LayoutInflater inflater, ViewGroup parent,Context context,int position) {
// view yüklenir
if (null == v) {
v = inflater.inflate(layoutId, parent, false);
// view invoke edilir
invokeView(v);
v.setTag(viewHolder);
} else {
viewHolder = (T) v.getTag();
}
// date view bağlanır
mappingData(viewHolder, entity,context,position);
return v;
}
public Object returnEntity()
{
return entity;
}
protected abstract void mappingData(T viewHolder, E entity,Context context,int background);
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface InvokeView {
int viewId();
}
通用适配器
public class GenericAdapter extends BaseAdapter implements Filterable {
private String TAG = "GenericAdapter";
private LayoutInflater inflater;
private List<Adaptable> items;
private List<Adaptable> cachedItems;
private Context context;
@SuppressWarnings("unchecked")
public GenericAdapter(List<?> items, Context c) {
this.items = (List<Adaptable>) items;
cachedItems = new ArrayList<Adaptable>();
for (Object object : items) {
this.cachedItems.add(((Adaptable)object));
}
inflater = LayoutInflater.from(c);
context = c;
}
@Override
public int getCount() {
if (items == null)
return 0;
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return items.get(position).buildView(convertView, inflater, parent,context, position);
}
}
公共类GenericaAdapter扩展BaseAdapter实现可过滤{
私有字符串TAG=“GenericaAdapter”;
私人充气机;
私人清单项目;
私有列表缓存;
私人语境;
@抑制警告(“未选中”)
公共通用适配器(列表项,上下文c){
this.items=(列表)项;
cachedItems=新的ArrayList();
用于(对象:项){
this.cachedItems.add(((自适应)对象));
}
充气机=来自(c)的充气机;
上下文=c;
}
@凌驾
public int getCount(){
if(items==null)
返回0;
返回items.size();
}
@凌驾
公共对象getItem(int位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
returnitems.get(position).buildView(convertView、inflater、parent、context、position);
}
}
看起来您正在为每一行重用相同的viewHolder对象。此外,如果您对视图注入感兴趣,您还应该看看
这就是BaseView
的外观:
public View buildView(View v, LayoutInflater inflater, ViewGroup parent,Context context,int position) {
ViewHolder viewHolder;
if (v == null) {
v = inflater.inflate(layoutId, parent, false);
viewHolder = new ViewHolder();
invokeView(viewHolder, v);
v.setTag(viewHolder);
} else {
viewHolder = v.getTag();
}
//...
}
protected void invokeView(ViewHolder viewHolder, View v) {
try {
Field fs[] = viewHolder.getClass().getFields();
for (Field f : fs) {
InvokeView a = (InvokeView) f.getAnnotation(InvokeView.class);
int id = a.viewId();
f.set(viewHolder, v.findViewById(id));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}