搭建一个简单、易用的 Android 项目框架之 BaseAdapter(三)

    xiaoxiao2021-03-25  64

    今天我们来介绍下 BaseAdapter (为了避免与原 BaseAdater 命名相同取名为:TBaseAdapter)的封装,当然,适配上 Android 原生提供的 ArrayAdapter 也挺好用的只是自己不喜欢使用它,多话不说,直接上代码。

    public abstract class TBaseAdapter<E> extends android.widget.BaseAdapter { protected Context mContext;//通用上下文 private Toast toast; protected LayoutInflater inflater; protected List<E> list = new ArrayList<E>(); protected int screen_width; public TBaseAdapter(Context context, List<E> list) { this.mContext = context; if (list != null && list.size() > 0) { this.list = list; } this.toast = Toast.makeText(mContext, "", Toast.LENGTH_SHORT); this.screen_width = PreferManager.getInt(PreferManager.SCREEN_WIDTH, 1080); this.inflater = LayoutInflater.from(context); } @Override public int getCount() { return list == null ? 0 : list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } protected void toShow(String str) { if (!TextUtils.isEmpty(str)) { toast.setText(str); toast.show(); } } protected void toShow(int strId) { toShow(mContext.getString(strId)); } public void refreshData(List<E> list) { this.list = list; notifyDataSetChanged(); } public void addData(List<E> list) { this.list.addAll(list); notifyDataSetChanged(); } }

    注:(1)在构造函数里面初始化了一些基本参数用于子类使用,实现了 一些子类中使用第不高的方法,保留了 getView 方法不实现,并增加了设置refreshData()和添加数据addData()的方法。

    下面是一个通过 TBaseAdapter 实现的列表页面

    (1)以上页面的页面的 Adapter 的实现

    public class TestAdapter extends TBaseAdapter<TestData> { public TestAdapter(Context context, List<TestData> list) { super(context, list); } @Override public View getView(int position, View convertView, ViewGroup parent) { TestData model = list.get(position); final ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.item_test, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tv_name.setText("(^_^) 姓名:" + model.name + "=====年龄:" + model.age); return convertView; } class ViewHolder extends TBaseHolder {//ViewHolder TextView tv_name; public ViewHolder(View view) { tv_name = $(view, R.id.tv_name); } } }

    (2)Adapter 的 Item 项的布局文件的实现

    <?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="wrap_content" android:background="@color/white" android:orientation="vertical"> <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="8dp" android:textSize="14sp"/> </LinearLayout>

    (3)TestAdapter 的内部类 TBaseHolder 的基类实现

    public class TBaseHolder { @SuppressWarnings({"unchecked"}) protected <T> T $(View view, int id) { T subView = (T) view.findViewById(id); return subView; } } (4)主页面的Activity 的代码实现

    public class TestActivity extends TBaseActivity implements Handler.Callback { private ListView listView; private TestAdapter adapter; private List<TestData> list = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.act_test); super.onCreate(savedInstanceState); } @Override public void initViewAfterOnCreate() { listView = $(R.id.listView); backWithTitle("测试标题"); } @Override public void initDataAfterOnCreate() { list.addAll(testData()); adapter = new TestAdapter(mContext, list); listView.setAdapter(adapter); new Handler(this).sendEmptyMessageDelayed(0, 2000); showToast("模拟网络加载数据中,请稍候..."); } private ArrayList<TestData> testData() { Random random = new Random(); ArrayList arrayList = new ArrayList(); for (int i = 0; i < 10; i++) { arrayList.add(new TestData("No." + (i + 1), random.nextInt(100))); } return arrayList; } @Override public boolean handleMessage(Message msg) { showToast("数据加载成功"); list.addAll(testData()); adapter.refreshData(list); return false; } }

    (5)主 Activity 页面的主布局文件的代码

    <?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:fitsSystemWindows="true" android:orientation="vertical"> <include layout="@layout/title_bar"/> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:cacheColorHint="@color/transparent" android:divider="#ccc" android:dividerHeight="1px"/> </LinearLayout>

    注:通过以TBaseAdapter 的封闭,TestAdapter 的实现明显简洁了不少,只面要实现 getview 方法即可,剩下的只需要实现 Holder 的定义。

    Demo GitHub 地址:https://github.com/chende008/TestProject

    转载请注明原文地址: https://ju.6miu.com/read-13620.html

    最新回复(0)