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

}

然后写个BaseActivity:

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

}

封装个简易Adapter:

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);
时间: 2024-12-09 04:49:57

Adapter简化写法以及findViewById()方法的优化的相关文章

数据库有百万数据量的情况下,分页查询的方法及其优化方式

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 下面简单说一下我知道的一些方法. 准备工作 为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明. 表名:order_history 描述:某个业务的订单历史表 主要字段:unsigned int id,tinyint(4) int type 字段情况:该表一共37个字段,不包含text等大型数据,最大为varch

函数常见的写法及调用方法整理

我们平时在阅读别人的代码的时候,总能看到别人在写函数的时候,有各种不同的写法及调用方法,今天就总结下我所遇到过的函数常见的写法及调用方法. 一.函数声明 // 函数的写法 function sum(a, b) { return a + b; } // 调用 sum(1,2); // 3  二.函数表达式 // 函数的写法 var sum = function (a, b) { return a + b; } // 调用 sum(2, 3); // 5 三.将方法作为一个对象 // 作为对象方法,

Android中通过注解代替findViewById方法

尊重原创 http://write.blog.csdn.net/postedit/26507351 这篇文章主要讲解注解实现findViewById的功能,首先我们来熟悉一下在java中怎么定义一个注解和解析一个注解 注解的概念是在jdk5.0中提出来的,在java.lang的包中已经定义了三个注解:Override,Deprecated,SuppressWarnings Override相信大家非常熟悉,就是表明这个方法是改写了父类的方法 Deprecated表示在新版本的 jdk中已经不建议

Android开发-- findViewById()方法得到空指针

如果想通过调用findViewById()方法获取到相应的控件,必须要求当前Activity的layout通过setContentView. 如果你通过其他方法添加了一个layout,如需获取这个layout中的View对象,首先需inflate这个layout,然后在该layout上调用findViewById(). 1 View v = inflater.inflate(id_number_of_layout); 2 View innerView = v.findViewById(id_nu

BizTalk 2013R2 WCF-LOB Oracle Adapter安装配置/问题&解决方法

BizTalk 2013R2 WCF-LOB Oracle Adapter安装配置/问题&解决方法 安装Oracle Adapter 安装Oracle客户端 BizTalk 2013R2 安装包自带的WCF LOB Adapter Pack for Oracle 需要Oracle客户端组件 ODP.NET或ODAC组件.这里很容易出现问题,版本的不兼容,因为Oracle Adapter默认需要安装 11.1.0.7这个版本 The Oracle Database adapter uses the

iOS总结_IOS开发部分语法的简化写法

下列简化写法是IOS6.0以后的新写法 NSNumber //简化前的写法: NSNumber *value1; value1 = [NSNumber numberWithInt:12345]; value1 = [NSNumber numberWithFloat:123.45f]; value1 = [NSNumber numberWithDouble:123.45]; value1 = [NSNumber numberWithBool:YES]; //简化后的写法: NSNumber *va

《Python CookBook2》 第一章 文本 - 检查字符串中是否包含某字符集合中的字符 &amp;&amp; 简化字符串的translate方法的使用

检查字符串中是否包含某字符集合中的字符  任务: 检查字符串中是否出现了某个字符集合中的字符 解决方案: 方案一: import itertools def containAny(seq,aset): for item in itertools.ifilter(aset.__contains__,seq): return True return False if __name__ == "__main__": l1 = list('python') l2 = set('x') prin

求100以内素数的5中基本方法及其优化

求100以内素数的5中基本方法及其优化方法1 基本做法 错解比较:进入了小循环:有时加pass也可以.错解:这里的print也同样注意不要写到循环内. 注释:1.两种条件运用:为合数.2.以上错误点.方法二 注释:1.条件运用,质数除了2都是奇数,因为偶数都能被除了自身外的2整除.改进自12.偶数除了2都不是质数.3.第二个for写的是到开方的奇数.4.奇数含有质数和非质数.偶数除了2一定不是质数.所以先剥离了偶数. 方法三:使用列表 注释:1.break continue pass2.质数i依

加速ssh连接的方法(优化ssh服务)

目录 加速ssh连接的方法(优化ssh服务) 一.修改 /etc/ssh/sshd_config 二.修改被连接端的文件 /etc/nsswitch.conf 三.修改主动连接端的 /etc/hosts 四.查看连接过程 ssh -v 加速ssh连接的方法(优化ssh服务) 本文参考于https://www.cnblogs.com/fwdxl/p/6723820.html,在其基础上略做整理. 一.修改 /etc/ssh/sshd_config 经常出现ssh连接缓慢,让人误以为是ssh连接不上