0

以下のコードを見ると、v が null かそうでないかを制御している場合、ビューを再膨張させる必要がない場合、リストビューに問題があります。

リストビューをスクロールすると、行の値が変化し、繰り返されます。** " if (null == v) { " ** を削除することで、この問題を解決できます。しかし、現時点では、リストビューをスクロールするとちらつきます。

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);

}

InvokeView

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface InvokeView {
    int viewId();
}

GenericAdapter

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);
    }
}
4

1 に答える 1

0

行ごとに同じ viewHolder オブジェクトを再利用しているようです。また、ビュー インジェクションに興味がある場合は、ButterKnifeも参照してください。

これはあなたがどの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();
     }
 }
于 2013-06-10T12:18:45.370 に答える