成品展示:
动物说
参考链接:
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
一、基本实现
-
编写数据的基本类
我们一般存到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; } } -
编写布局
这里要写两个布局。
一个是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中的显示格式没变
-
完成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; } } -
完成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。
- 自定义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
-
- item_list_animal是如何加载到ListView中的?
就是利用adapter中的getView()方法来将ListView中的每个Item格式填充为我们的格式。 - adapter配合ListView的写法步骤?
ListView详解
(1) 布局文件里申明ListView ,设置id号和其他相关参数
(2) 在代码中通过findViewById方法找到listView控件
(3) 设置适配器,可以单独定义出一个类继承相关的适配器,也可以创建一个适配器的匿名内部类。关键取决于代码的复杂程度。
(4) 重写适配器中的方法。主要有两个,一个是getCount()表示listview的条目数。另一个是getView返回显示的View ,表示每一个条目的视图。getView()方法在每个子项被滚动到屏幕内的时候会被调用。
(5) ListView列表项的点击事件 listView.setOnItemClickLinstener()










网友评论