对BaseAdapter和ViewHolder的封装
2015-11-15 13:43
316 查看
项目结构如下:
其中MyBaseAdapter和BaseHolder是2个抽象类,分别是对BaseAdapter和ViewHolder的封装.MainActivity为测试类.
1.MyBaseAdapter类
2.BaseHolder类
3.MainActivity测试类
4.item_list.xml文件
5.测试效果
其中MyBaseAdapter和BaseHolder是2个抽象类,分别是对BaseAdapter和ViewHolder的封装.MainActivity为测试类.
1.MyBaseAdapter类
package com.example.mchenys.mybaseadapterdemo.adapter; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.example.mchenys.mybaseadapterdemo.holder.BaseHolder; import java.util.List; /** * 自定义BaseAdapter的基类 * Created by mChenys on 2015/11/15. */ public abstract class MyBaseAdapter<T> extends BaseAdapter { private List<T> mData; public MyBaseAdapter(List<T> data) { mData = data; } @Override public int getCount() { return mData == null ? 0 : mData.size(); } @Override public T getItem(int position) { return mData == null ? (T) null : mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { BaseHolder holder; if (null == convertView) { holder = getBaseHolder(position); convertView = holder.getConvertView(); } else { holder = (BaseHolder) convertView.getTag(); } holder.setData(getItem(position)); return convertView; } /** * 由子类去实现获取BaseHolder的方法 * * @param position * @return BaseHolder */ public abstract BaseHolder getBaseHolder(int position); }
2.BaseHolder类
package com.example.mchenys.mybaseadapterdemo.holder; import android.view.View; /** * 自定义BaseHolder的基类 * Created by mChenys on 2015/11/15. */ public abstract class BaseHolder<T> { private View mRootView; private T mData; public BaseHolder() { //初始化item的根布局 mRootView = initItemLayout(); //绑定holder到当前根布局中 mRootView.setTag(this); } /** * 获取item的根布局 * * @return */ public View getConvertView() { return mRootView; } /** * 设置item的数据 * * @param t 具体的数据 */ public void setData(T t) { mData = t; refreshView(t); } /** * 获取显示的数据 * * @return */ public T getmData() { return mData; } /** * 由子类去实现刷新界面数据的方法 * * @param t 具体的数据 */ public abstract void refreshView(T t); /** * 由具体的子类去实现初始化listView Item的根布局 * * @return */ public abstract View initItemLayout(); }
3.MainActivity测试类
package com.example.mchenys.mybaseadapterdemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.ListView; import android.widget.TextView; import com.example.mchenys.mybaseadapterdemo.adapter.MyBaseAdapter; import com.example.mchenys.mybaseadapterdemo.holder.BaseHolder; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private List<String> mData = new ArrayList<>(); private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mListView = new ListView(this); setContentView(mListView); initData(); showListView(); } /** * 显示ListView */ private void showListView() { mListView.setAdapter(new MyBaseAdapter<String>(mData) { @Override public BaseHolder getBaseHolder(int position) { return new BaseHolder<String>() { private TextView tvInfo; @Override public View initItemLayout() { View view = View.inflate(MainActivity.this, R.layout.item_list, null); tvInfo = (TextView) view.findViewById(R.id.id_tv_info); return view; } @Override public void refreshView(String s) { tvInfo.setText(s); } }; } }); } /** * 初始化测试数据 */ private void initData() { for (int i = 0; i < 20; i++) { mData.add("测试数据:" + i); } } }
4.item_list.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/id_tv_info" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="10dp" /> </LinearLayout>
5.测试效果
相关文章推荐
- 《JavaScript高级程序设计》笔记
- 设计一款适合父母使用的手机
- 大数值
- Docker(三):Docker的基本概念
- 从Access到Sqlite
- 雅虎初始化代码
- Android Studio的使用(四)--生成Get、Set方法
- 找回Ubuntu 13.04 ‘Backspace’键 的‘返回’功能
- Android之本地图片轮播(广告轮播)
- [1090]:A+B for Input-Output Practice (II)
- Angular最佳实践之$http-麻雀虽小 五脏俱全
- 初学Android项目:开发电子市场<第二天>下
- virtualbox下最小化安装centos7后上网设置 不能上网
- 信息安全系统设计基础第十周学习总结
- 前端工程之构建工具-gulp实战
- Sublim Text2 安裝 Package Control 和 Ctags插件的方法
- Java PinBall 简单弹球小游戏【3】球拍左右移动和场景的监听器
- Javascript编码规范
- Java多线程之线程状态
- 用apachebench给服务器做并发压力性能测试