文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android如何实现自定义可复用的BaseAdapter

2023-07-04 15:28

关注

这篇文章主要讲解了“Android如何实现自定义可复用的BaseAdapter”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android如何实现自定义可复用的BaseAdapter”吧!

项目结构设计

Android如何实现自定义可复用的BaseAdapter

UI端的设计

Android的开发我发觉历年的指导开发学习的过程有一个特性,它和后台、微服务的开发其实是一个思路。即:先设计模型(DB、MONGO、REDIS)、数据流存取再做代码设计才能往往想得更周到。此处的UI指的就是我们的布局、界面长什么。根据布局、界面长什么样,然后倒推我们的后端代码,往往更容易入门、入手。

带有GridView布局的activity_main.xml

这是一个一行三列布局的Grid

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:padding="5dp"    tools:context=".MainActivity">     <!--numColumns设置每行显示多少个-->    <GridView        android:id="@+id/gridPhoto"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:numColumns="3" /> </RelativeLayout>

带有GridView里显示明显控件的item_list.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:padding="5dp">     <ImageView        android:id="@+id/iconImg"        android:layout_width="64dp"        android:layout_height="64dp"        android:layout_centerInParent="true"        android:src="@drawable/icon_1_128"        />     <TextView        android:id="@+id/iconText"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@id/iconImg"        android:layout_centerHorizontal="true"        android:layout_marginTop="30dp"        android:text="text"        android:textSize="18sp"        /> </RelativeLayout>

可复用的Adapter的代码设计

我们使用我们一惯的风格,先用逻辑性的语言来描述这个类的设计。各位一定要养成这样的一个习惯,即OOP编程它本身就是用代码来实现现实世界事物用的。因此在现实世界可以用逻辑、抽象、总结后的事物再去用OOP语言实现往往来得更直观、更友好、可读性更好。

下面我们来看这个Abstract类的完整写法

可复用的Adapter-GenericAdapter

package org.mk.android.demogreidview; import android.content.Context;import android.util.Log;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView; import java.util.ArrayList;import java.util.List; public abstract class GenericAdapter <T> extends BaseAdapter {    private List<T> data;    private int layoutRes;     public GenericAdapter() {    }     public GenericAdapter(List<T> data, int layoutRes) {        this.data = data;        this.layoutRes = layoutRes;    }     @Override    public int getCount() {        Log.i("app",">>>>>>data.size: "+data.size());        if(data!=null) {            return data.size();        }        return 0;    }     @Override    public T getItem(int position) {        return data.get(position);    }     @Override    public long getItemId(int position) {        return position;    }     @Override    public View getView(int position, View convertView, ViewGroup parent) {        Log.i("app",">>>>>>into getView");        ViewHolder holder = ViewHolder.bind(parent.getContext(), convertView, parent, layoutRes                , position);        bindView(holder, getItem(position));        return holder.getItemView();    }     //添加一个元素    public void add(T item) {        if (data == null) {            data = new ArrayList<>();        }        data.add(item);        notifyDataSetChanged();    }     //往特定位置,添加一个元素    public void add(int position,T item){        if (data == null) {            data = new ArrayList<>();        }        data.add(position, item);        notifyDataSetChanged();    }     public void remove(T item) {        if(data != null) {            data.remove(item);        }        notifyDataSetChanged();    }     public void remove(int position) {        if(data != null) {            data.remove(position);        }        notifyDataSetChanged();    }     public void clear() {        if(data != null) {            data.clear();        }        notifyDataSetChanged();    }     public abstract void bindView(ViewHolder holder, T obj);     public static class ViewHolder {         private SparseArray<View> mViews;   //存储ListView 的 item中的View        private View item;                  //存放convertView        private int position;               //游标        private Context context;            //Context上下文         //构造方法,完成相关初始化        private ViewHolder(Context context, ViewGroup parent, int layoutRes) {            mViews = new SparseArray<>();            this.context = context;            View convertView = LayoutInflater.from(context).inflate(layoutRes, parent,false);            convertView.setTag(this);            item = convertView;        }        public static ViewHolder bind(Context context, View convertView, ViewGroup parent,                                      int layoutRes, int position) {            ViewHolder holder;            if(convertView == null) {                holder = new ViewHolder(context, parent, layoutRes);            } else {                holder = (ViewHolder) convertView.getTag();                holder.item = convertView;            }            holder.position = position;            return holder;        }        public <T extends View> T getView(int id) {            T t = (T) mViews.get(id);            if(t == null) {                t = (T) item.findViewById(id);                mViews.put(id, t);            }            return t;        }                public View getItemView() {            return item;        }                 public int getItemPosition() {            return position;        }                 public ViewHolder setText(int id, CharSequence text) {            View view = getView(id);            if(view instanceof TextView) {                ((TextView) view).setText(text);            }            return this;        }                 public ViewHolder setImageResource(int id, int drawableRes) {            View view = getView(id);            if(view instanceof ImageView) {                ((ImageView) view).setImageResource(drawableRes);            } else {                view.setBackgroundResource(drawableRes);            }            return this;        }                 public ViewHolder setTag(int id, Object obj) {            getView(id).setTag(obj);            return this;        }         public ImageView iconImg;        public TextView iconText;    }}

业务(ViewBean)Bean-IconBean

package org.mk.android.demogreidview; import java.io.Serializable; public class IconBean implements Serializable {    public IconBean(int imgId, String iconText) {        this.imgId = imgId;        this.iconText = iconText;    }     private int imgId;    private String iconText = "";     public int getImgId() {        return imgId;    }     public void setImgId(int imgId) {        this.imgId = imgId;    }     public String getIconText() {        return iconText;    }     public void setIconText(String iconText) {        this.iconText = iconText;    }}

主交互端-MainActivity

package org.mk.android.demogreidview; import androidx.appcompat.app.AppCompatActivity; import android.content.Context;import android.os.Bundle;import android.util.Log;import android.widget.BaseAdapter;import android.widget.GridView; import java.util.ArrayList;import java.util.List;  public class MainActivity extends AppCompatActivity {    private Context ctx;    private GridView gridPhoto;    private BaseAdapter adapter = null;    private List<IconBean> data = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        gridPhoto = (GridView) findViewById(R.id.gridPhoto);         data = new ArrayList<IconBean>();        data.add(new IconBean(R.drawable.icon_1_128, "图标1"));        data.add(new IconBean(R.drawable.icon_2_128, "图标2"));        data.add(new IconBean(R.drawable.icon_3_128, "图标3"));        data.add(new IconBean(R.drawable.icon_4_128, "图标4"));        data.add(new IconBean(R.drawable.icon_5_128, "图标5"));        data.add(new IconBean(R.drawable.icon_6_128, "图标6"));        data.add(new IconBean(R.drawable.icon_7_128, "图标7"));        adapter = new GenericAdapter<IconBean>(data, R.layout.item_list) {            @Override            public void bindView(ViewHolder holder, IconBean obj) {                holder.setImageResource(R.id.iconImg, obj.getImgId());                holder.setText(R.id.iconText, obj.getIconText());            }        };        Log.i("app",">>>>>>before display");        gridPhoto.setAdapter(adapter);    }}

感谢各位的阅读,以上就是“Android如何实现自定义可复用的BaseAdapter”的内容了,经过本文的学习后,相信大家对Android如何实现自定义可复用的BaseAdapter这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯