package com.netease.nim.uikit.common.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.netease.nim.uikit.common.util.log.LogUtil; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class TAdapter<T> extends BaseAdapter implements IViewReclaimer { protected final Context context; private final List<T> items; private final TAdapterDelegate delegate; private final LayoutInflater inflater; private final Map<Class<?>, Integer> viewTypes; private Object tag; private boolean mutable; private Set<IScrollStateListener> listeners; public TAdapter(Context context, List<T> items, TAdapterDelegate delegate) { this.context = context; this.items = items; this.delegate = delegate; this.inflater = LayoutInflater.from(context); this.viewTypes = new HashMap<Class<?>, Integer>(getViewTypeCount()); this.listeners = new HashSet<IScrollStateListener>(); } @Override public int getCount() { return items == null ? 0 : items.size(); } public T getItem(int position) { return position < getCount() ? items.get(position) : null; } public long getItemId(int position) { return position; } public boolean isEnabled(int position) { return delegate.enabled(position); } public List<T> getItems() { return items; } @Override public View getView(int position, View convertView, ViewGroup parent) { return getView(position, convertView, parent, true); } public View getView(final int position, View convertView, ViewGroup parent, boolean needRefresh) { if (convertView == null) { convertView = viewAtPosition(position); } TViewHolder holder = (TViewHolder) convertView.getTag(); holder.setPosition(position); if (needRefresh) { try { holder.refresh(getItem(position)); } catch (RuntimeException e) { LogUtil.e("TAdapter", "refresh viewholder error. " + e.getMessage()); } } if (holder instanceof IScrollStateListener) { listeners.add(holder); } return convertView; } @Override public int getViewTypeCount() { return delegate.getViewTypeCount(); } @Override public int getItemViewType(int position) { if (getViewTypeCount() == 1) { return 0; } Class<?> clazz = delegate.viewHolderAtPosition(position); if (viewTypes.containsKey(clazz)) { return viewTypes.get(clazz); } else { int type = viewTypes.size(); if (type < getViewTypeCount()) { viewTypes.put(clazz, type); return type; } return 0; } } @Override public void reclaimView(View view) { if (view == null) { return; } TViewHolder holder = (TViewHolder) view.getTag(); if (holder != null) { holder.reclaim(); listeners.remove(holder); } } public void onMutable(boolean mutable) { boolean becomeImmutable = this.mutable && !mutable; this.mutable = mutable; if (becomeImmutable) { for (IScrollStateListener listener : listeners) { listener.onImmutable(); } listeners.clear(); } } public boolean isMutable() { return mutable; } public View viewAtPosition(int position) { TViewHolder holder = null; View view = null; try { Class<?> viewHolder = delegate.viewHolderAtPosition(position); holder = (TViewHolder) viewHolder.newInstance(); holder.setAdapter(this); } catch (Exception e) { e.printStackTrace(); } view = holder.getView(inflater); view.setTag(holder); holder.setContext(view.getContext()); return view; } public Object getTag() { return tag; } public void setTag(Object tag) { this.tag = tag; } }