以下のコードを見ると、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);
}
}