标签:优化 adapter 简化 findviewbyid
首先写个ViewHolder:
public class ViewHolder { private View mConvertView; private Activity mActivity; private SparseArray<View> mViewArray; // 包含了View引用的SparseArray public ViewHolder(View convertView) { this.mConvertView = convertView; } public ViewHolder(Activity activity) { this.mActivity = activity; } public <T extends View> T get(int viewId) {//通过ViewId得到View if (mActivity == null) {// ListAdapter的ViewHolder SparseArray<View> viewHolder = (SparseArray<View>) mConvertView.getTag(); if (viewHolder == null) { viewHolder = new SparseArray<View>(); mConvertView.setTag(viewHolder); } View childView = viewHolder.get(viewId); if (childView == null) { childView = mConvertView.findViewById(viewId); viewHolder.put(viewId, childView); } return (T) childView; } else { // Activity的ViewHolder if (mViewArray == null) { mViewArray = new SparseArray<View>(); } View childView = mViewArray.get(viewId); if (childView == null) { childView = mActivity.findViewById(viewId); mViewArray.put(viewId, childView); } return (T) childView; } } public void setText(int viewId, String text) {// 通过ViewId设置Text ((TextView) get(viewId)).setText(text); } public void setText(int viewId, Spanned text) {// 通过ViewId设置Text ((TextView) get(viewId)).setText(text); } public void setTextColor(int viewId, int color) {//通过ViewId设置TextColor ((TextView) get(viewId)).setTextColor(color); } public void setImageResource(int viewId, int resId) {//通过ViewId设置图片 ((ImageView) get(viewId)).setImageResource(resId); } public void setImageBitmap(int viewId, Bitmap bm) {// 通过ViewId设置图片 ((ImageView) get(viewId)).setImageBitmap(bm); } public void setImageDrawable(int viewId, Drawable drawable) {//通过ViewId设置图片 ((ImageView) get(viewId)).setImageDrawable(drawable); } public void setImageUrl(int id, String url) {//通过ViewId设置网络图片 // Rosemary.loadImage(url, (ImageView) get(id)); } public void setImageUrl(int id, String url, int resId) {// 通过ViewId设置网络图片 // Rosemary.loadImage(url, (ImageView) get(id), resId); } public void setVisibility(int viewId, int visibility) {//通过ViewId设置隐藏和显示 get(viewId).setVisibility(visibility); } public void setOnClickListener(int viewId, View.OnClickListener l) {//通过ViewId设置点击监听 get(viewId).setOnClickListener(l); } }
public class BaseActivity extends ActionBarActivity { protected ViewHolder mHolder; public <T> T $(int viewID) { return (T) mHolder.get(viewID); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BaseApplication.getInstance().addActivity(this); mHolder = new ViewHolder(this); } }
public abstract class ListAdapter<T> extends BaseAdapter { protected Context mContext; protected LayoutInflater mInflater; protected List<T> mList; // 数据集 protected int mLayoutID; // 布局资源ID protected ListAdapter() { } public ListAdapter(Context ctx, List<T> list, int layoutID) { mContext = ctx; mInflater = LayoutInflater.from(ctx); mList = list; mLayoutID = layoutID; } @Override public int getCount() { if (mList != null && mList.size() > 0) return mList.size(); return 0; } @Override public T getItem(int position) { if (mList != null && mList.size() > 0) return mList.get(position); return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) convertView = mInflater.inflate(mLayoutID, null); ViewHolder holder = new ViewHolder(convertView); onBind(position, getItem(position), holder); return convertView; } /** * 绑定数据 */ protected abstract void onBind(int position, T item, ViewHolder holder); }
public class BlacklistActivity extends VolleyActivity implements IInit, IResponseHandler { private ListView mListView; private BlacklistViewModel mViewModel = new BlacklistViewModel(); private ListAdapter<BlacklistViewModel> mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_blacklist); init(); } @Override public void init() { ActionBarUtil.setup(this, "我的黑名单"); mListView = $(R.id.lv_blacklist); fetchData(FIRST); } @Override public void fetchData(int tag) { toggleProgress(true); if (tag == FIRST) { // 请求黑名单列表 GetBlackBuyerListParam param = new GetBlackBuyerListParam(mViewModel.getPageIndex(), Data.PAGE_SIZE_LARGE, Data.getUserID()); UserApi.getBlackBuyerList(this, param, tag); } else if (tag == SECOND) { // 移出黑名单 RemoveBlackBuyerParam param = new RemoveBlackBuyerParam(Data.getUserID(), mViewModel.getList().get(mViewModel.getCurrentPosition()).getModel().getBuyerID()); UserApi.removeBlackBuyer(this, param, tag); } } @Override public void updateUI(Object response, int tag) { if (response == null) return; if (tag == FIRST) { mViewModel.inflate(response); // 黑名单列表 if (mAdapter == null) { mAdapter = new ListAdapter<BlacklistViewModel>(this, mViewModel.getList(), R.layout.item_blacklist) { @Override protected void onBind(final int position, final BlacklistViewModel item, ViewHolder holder) { holder.setImageUrl(R.id.iv_avatar, item.getModel().getHeadImageUrl(), R.drawable.defaultportrait); holder.setOnClickListener(R.id.iv_avatar, new View.OnClickListener() { @Override public void onClick(View v) { IntentUtil.toPersonInfo(BlacklistActivity.this, item.getModel().getBuyerID()); } }); holder.setText(R.id.tv_name, item.getModel().getBuyerName()); holder.setOnClickListener(R.id.btn_remove, new View.OnClickListener() { @Override public void onClick(View v) { mViewModel.setCurrentPosition(position); new AlertDialog.Builder(BlacklistActivity.this).setMessage(String.format("确定将“%s”从黑名单中移除吗?", item.getModel().getBuyerName())).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { fetchData(SECOND); } }).setNegativeButton(android.R.string.cancel, null).create().show(); } }); } }; mListView.setAdapter(mAdapter); mListView.setEmptyView(findViewById(R.id.iv_no_data)); } else { mAdapter.notifyDataSetChanged(); } } else if (tag == SECOND) { if (((Boolean) response)) { ToastUtil.show(this, "移除成功!"); mViewModel.getList().remove(mViewModel.getCurrentPosition()); mAdapter.notifyDataSetChanged(); } } } }
以前要写mListView = (ListView)findViewById(R.id.lv_blacklist);
现在只要写mListView = $(R.id.lv_blacklist);就可以
而且adapter简化成几行代码:
mAdapter = new ListAdapter<BlacklistViewModel>(this, mViewModel.getList(), R.layout.item_blacklist) { @Override protected void onBind(final int position, final BlacklistViewModel item, ViewHolder holder) { holder.setImageUrl(R.id.iv_avatar, item.getModel().getHeadImageUrl(), R.drawable.defaultportrait); holder.setOnClickListener(R.id.iv_avatar, new View.OnClickListener() { @Override public void onClick(View v) { IntentUtil.toPersonInfo(BlacklistActivity.this, item.getModel().getBuyerID()); } }); holder.setText(R.id.tv_name, item.getModel().getBuyerName()); holder.setOnClickListener(R.id.btn_remove, new View.OnClickListener() { @Override public void onClick(View v) { mViewModel.setCurrentPosition(position); new AlertDialog.Builder(BlacklistActivity.this).setMessage(String.format("确定将“%s”从黑名单中移除吗?", item.getModel().getBuyerName())).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { fetchData(SECOND); } }).setNegativeButton(android.R.string.cancel, null).create().show(); } }); } }; mListView.setAdapter(mAdapter);
Adapter简化写法以及findViewById()方法的优化
标签:优化 adapter 简化 findviewbyid
原文地址:http://blog.csdn.net/pengkv/article/details/44828901