美文网首页
一个简单例子 Adapter配合 ListView显示数据

一个简单例子 Adapter配合 ListView显示数据

作者: 小星star | 来源:发表于2019-01-22 13:09 被阅读6次

成品展示:

动物说
参考链接:
http://www.runoob.com/w3cnote/android-tutorial-listview.html
https://blog.csdn.net/u011682673/article/details/50735941
https://www.cnblogs.com/huangjie123/p/5990737.html

一、基本实现

  1. 编写数据的基本类
    我们一般存到bean包

    public class Animal {
        private String aName;
        private String aSpeak;
        private int aIcon;
    
        public Animal(){
        }
    
        public Animal(String aName, String aSpeak, int aIcon){
            this.aName = aName;
            this.aSpeak = aSpeak;
            this.aIcon = aIcon;
        }
    
        public String getaName() {
            return aName;
        }
    
        public String getaSpeak() {
            return aSpeak;
        }
    
        public int getaIcon() {
            return aIcon;
        }
    }
    
    
  2. 编写布局
    这里要写两个布局。
    一个是item_list_animal,这是listView每个item的显示格式

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    
        <ImageView
            android:id="@+id/img_icon"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:paddingLeft="8dp"
            android:background="@color/prue"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/txt_aName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="8dp"
                android:background="@color/blue"/>
            <TextView
                android:id="@+id/txt_aSpeak"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="8dp"
                android:background="@color/green"/>
        </LinearLayout>
    
    </LinearLayout>        
    

    另一个就是咱们的activity_main,里面包含一个空间,listView

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <TextView
                android:id="@+id/title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="动物说" />
    
            <ListView
                android:id="@+id/list_animal"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@+id/title">
            </ListView>
        </RelativeLayout>
    
    </android.support.constraint.ConstraintLayout>
    

    在这里我们发现 我们的main layout上面的listview 的每一个item并没有变成图片 + 文字描述的格式 。其实将item格式—item_list_animal加载到listview是由adapter来完成的


    ListView中的显示格式没变
  3. 完成adapter的编写
    一般我们自定义的adapter存在adapter包中,AnimalAdapter继承自BaseAdapter,而完成自定义adapter的编写一般只需要重写下面四个方法即可。在下方说明了为什么要重写这四个方法,以及他们各自的作用。

     public class AnimalAdapter extends BaseAdapter {
    
         private LinkedList<Animal> mData;
         private Context mContext;
    
         public AnimalAdapter(LinkedList<Animal> mData, Context mContext){
             this.mData = mData;
             this.mContext = mContext;
         }
    
         @Override
         public int getCount() {
             return mData.size();
         }
    
         @Override
         public Object getItem(int i) {
             return null;
         }
    
         @Override
         public long getItemId(int i) {
             return i;
         }
    
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal, parent, false);
             ImageView img_icon = (ImageView)convertView.findViewById(R.id.img_icon);
             TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
             TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
             img_icon.setBackgroundResource(mData.get(position).getaIcon());
             txt_aName.setText(mData.get(position).getaName());
             txt_aSpeak.setText(mData.get(position).getaSpeak());
             return convertView;
         }
     }
    
  4. 完成MainActivity的编写

    public class MainActivity extends AppCompatActivity {
        private ListView list_animal;
        private List<Animal> mData = null;
        private AnimalAdapter mAdapter = null;
        private Context mContext;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listview_main);
    
            initView();
        }
    
        private void initView(){
            mContext = MainActivity.this;
            list_animal = findViewById(R.id.list_animal);
            mData = new LinkedList<Animal>();
            initData(mData);
    
            mAdapter = new AnimalAdapter((LinkedList<Animal>)mData,mContext);
            list_animal.setAdapter(mAdapter);
        }
    
        private void initData(List<Animal> mData){
            mData.add(new Animal("狗说", "你是狗么?", R.mipmap.ic_icon_dog));
            mData.add(new Animal("牛说", "你是牛么?", R.mipmap.ic_icon_cow));
            mData.add(new Animal("蛇说", "你是蛇么?", R.mipmap.ic_icon_sneak));
            mData.add(new Animal("龙说", "你是龙么?", R.mipmap.ic_icon_dragon));
            mData.add(new Animal("马说", "你是马么?", R.mipmap.ic_icon_horse));
        }
    }
    

二、实现总结
ListView的设计遵循MVC设计模式,model,controller,view三者分工完成。
model即咱们最初编写的数据基本类;
controller在这里体现为adapter,他完成接收数据,并且把数据将要如何显示 告知给view;
而view,本例中的ListView,则根据controller传来的数据和显示格式来显示数据。

为什么说“controller在这里体现为adapter,他完成接收数据,并且把数据将要如何显示 告知给view?”
在getView()这个方法中,他确实接受数据,item数据mData[i],并且将item数据加工成 我们的想要的itemview。

  1. 自定义adapter时为什么要重写那4个方法?它们各自的作用?
    一个动物item包含了 图标,以及两个text
    一组动物 包含了很多个动物,本例中为5个
    4个方法:
    • getCount() 得到 我们要 绘制的资源数,在这里显示为mData.size() 意味着我们想要将全部资源都绘制 ,如果我们把它减一就会发现 只显示4个动物了。显然 这个绘制的资源数不等同于总资源数

      4个动物
      getCount还有一个小问题,那就是我们继承自BaseAdapter,但是Adapter里面并没有声明这个方法,这是因为他的基类Adapter中有这个方法
      image.png
    • getItem()
      暂时不知道含义

    • getItemId()
      暂时不知道含义

    • getView()
      通过传入的参数position,将第position个数据 加工 成我们想要的View并返回,最终供 ListView使用。 如 本例中 convertView是从context的viewGroup中获得的一个 itemView,


      image.png
  1. item_list_animal是如何加载到ListView中的?
    就是利用adapter中的getView()方法来将ListView中的每个Item格式填充为我们的格式。
  2. adapter配合ListView的写法步骤?
    ListView详解
    (1) 布局文件里申明ListView ,设置id号和其他相关参数
    (2) 在代码中通过findViewById方法找到listView控件
    (3) 设置适配器,可以单独定义出一个类继承相关的适配器,也可以创建一个适配器的匿名内部类。关键取决于代码的复杂程度。
    (4) 重写适配器中的方法。主要有两个,一个是getCount()表示listview的条目数。另一个是getView返回显示的View ,表示每一个条目的视图。getView()方法在每个子项被滚动到屏幕内的时候会被调用。
    (5) ListView列表项的点击事件 listView.setOnItemClickLinstener()

相关文章

网友评论

      本文标题:一个简单例子 Adapter配合 ListView显示数据

      本文链接:https://www.haomeiwen.com/subject/oysljqtx.html