android 低耦合度的adapter与holder案例,使用butterknife
2016-04-22 13:44
489 查看
叨叨
listview在开发中经常用到,因此adapter也是经常用到的东西,写多了难免会觉得比较麻烦,每次都写同样的代码。特别是实现重用这块,经常要写重复的代码,有时还需要在同一个方法只处理复杂的逻辑,这种写法在一定程度上提会影响可读性。所以抽空写了一个基类的adapter和holder,这里用butterknife注解来实现绑定view,并且解除了holder和adapter之间的耦合性,避免了有些情况下在adapter内部进行的复杂的逻辑处理。实现逻辑处理与view展示的分离。详细
adapter分离view实例化
通常都是用inflate来实例化view,这里将它抽取出来,子类的adapter只要将其所要实例化的view的布局的资源引用id传过来就可以@Override public View getView(int position, View convertView, ViewGroup parent) { BaseHolder holder=null; if (convertView == null) { holder = getHolder(mContext); convertView = View.inflate(mContext, getView(), null); ButterKnife.bind(holder, convertView);//用butterKnife绑定 convertView.setTag(holder); } else { holder = (BaseHolder) convertView.getTag(); } holder.setData(position,mData); return convertView; }抽象方法getView()
/** * * @return 返回布局的资源文件id */ protected abstract int getView();
分离holder
从上面的getView方法中,可以看到,这里依然用的是holder来实现view的数据设置通过getHolder(Context context)方法来获得需要的holder这里将holder抽取出来,通过泛型来传递数据public abstract class BaseHolder<T> { /** * 设置要显示的数据 * @param data 数据,转换成对应的数据对象 * @param position 当前item的位置 */ public abstract void setData(int position,T data); }子类只要继承它,然后传入对应的数据类型的data就可以。
adapter完整代码
基类adapterpublic abstract class NewBaseAdapter<T> extends BaseAdapter { protected Context mContext; protected T mData; public NewBaseAdapter(Context context){ mContext=context; } @Override public View getView(int position, View convertView, ViewGroup parent) { BaseHolder holder=null; if (convertView == null) { holder = getHolder(mContext); convertView = View.inflate(mContext, getView(), null); ButterKnife.bind(holder, convertView);//用butterKnife绑定 convertView.setTag(holder); } else { holder = (BaseHolder) convertView.getTag(); } holder.setData(position,mData);//将数据传给holder return convertView; } /** * 返回对应的holder类 * @param context 引用 * @return 返回对应的holder子类,需要继承自BaseHolder */ protected abstract BaseHolder getHolder(Context context); /** * * @return 返回布局的资源文件id */ protected abstract int getView(); /** * 设置数据 * @param data 对应的数据 */ public void setData(T data){ mData=data; } }
使用实例
adapter<pre name="code" class="java">public class HeheAdapter extends NewBaseAdapter<TestBean> { public HeheAdapter(Context context) { super(context); } @Override protected BaseHolder getHolder(Context context) { return new HeheHolder(); } @Override protected int getView() { return R.layout.item_layout; } @Override public int getCount() { if(mData==null){ return 0; } return mData.getSize(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } }holder:
public class HeheHolder extends BaseHolder<TestBean> { @Bind(R.id.item_tv) TextView mTvItem; @Override public void setData(int position, TestBean data) { mTvItem.setText(data.showLog()+":"+position); }testBean:
<span style="font-size:10px;">public class TestBean { public String showLog(){ Log.d("adapterdemo", "testbean"); return "testBean"; } public int getSize(){ return 10; } }</span><span style="font-size:18px;"> </span>mainactivity:
public class MainActivity extends AppCompatActivity { @Bind(R.id.listview) ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); initView(); } private void initView() { HeheAdapter adapter=new HeheAdapter(this); TestBean testBean = new TestBean(); adapter.setData(testBean); mListView.setAdapter(adapter); } }布局文件就不写了,只有一个listview控件。虽然看起来需要创建多个类,好像是比在adatper中直接实例复用、设置view显示逻辑复杂了,但是这里只是很简单的给view设置数据,如果碰到不同情况下不同view复用时根据不同的状态值来显示不同的布局或者数据时就有很大的作用了,会简化adapter中的代码量,往往不同的item布局之间只需要一个holder就能切换布局以及设置数据。放上全部demo代码http://download.csdn.net/detail/chniccs/9499083
相关文章推荐
- Android支付——支付宝支付总结
- Android-解决软键盘覆盖布局
- Android Studio 几个非常有用的工具
- Android 布局属性 Android:layout_weight 总结
- Android照相并返回照相结果的最终代码
- Android时间轴效果,直接使用在你的项目中
- 如何优化 Android Studio 启动、编译和运行速度?
- Android Studio 发布已签名的APK
- Android studio 中创建AIDL Service
- Android Logcat小结和adb常用命令
- Android Studio常用快捷键
- android studio 中如何让一个module依赖另一个module
- Android的activity启动模式,和生命周期,及onkeydown方法
- Android 中Adapter归纳
- android studio更新2.0后出现的Gradle sync failed: Unknown host等gradle问题解决办法
- Android之NDK开发(转)
- 《Android 应用》TextView追加文本并向下滚动
- android中sqlite数据库升级
- Android WebView 远程执行代码漏洞浅析
- android RSA加密的使用