本人正在安卓手机应用开发学习路上,希望通过博客来记录一些学过的东西和自己的理解,最好能帮助到路上的小伙伴啦,先上效果图
在记录这篇文章的时候,已经在学习数据库 SQLite的路上了,现在来分享下我对ListView的理解,在我学控件期间,这是让我感觉比较吃力的一个,不过搞清楚了这个,对以后学习RecyclerView非常有有帮助,进入正题
先了解下什么是ListView,直译就列表视图,当你的程序中有大量数据需要展示却因为手机屏幕有限而无法全部展示的时候,ListView在这时候就可以派上用场了,它的作用就是能让用户通过手指滑动加载隐藏的数据加载如屏幕内,这样一来,大量数据展示在小屏幕上就没有任何问题,滚动的加载的效果给用户的体验也是相当不错。但这个拥有强大功能的控件也有缺点,那就是数据内容的陈列局限于垂直方向,也因为ListView的局限,因此出现了更加强大的滚动控件-RecyclerView,能够通过属性设置数据的陈列方向,我的下篇记录文章就是RecylerView的简单应用。
了解完ListView的应用场景,下面就正式开始应用
ListView应用的基本流程:在相应布局文件中添加ListView控件 --> 在layout文件中创建item布局(也就是ListView中每一项内容的布局)--> 定义一个实体类(就是ListView中每个item要加载的数据)- -> 编写自定义适配器并重写其构造方法和getView()方法
1.在相应布局文件中添加ListView控件
<ListView android:id="@+id/lv" android:layout_width="wrap_content" android:layout_height="wrap_content"> </ListView>
从代码可以看到,这里添加ListView,就和一般的控件一样
2.在layout文件中创建item布局(也就是ListView中每一项内容的布局)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="70dp" android:layout_marginTop="30dp" android:background="@drawable/diy_frame" > <ImageView android:id="@+id/tu" android:layout_width="wrap_content" android:layout_height="match_parent" /> <TextView android:id="@+id/tv" android:gravity="center" android:layout_width="wrap_content" android:layout_height="match_parent" />这一步也非常的简单,就是简单的在layout文件里新建一个item布局文件,这个布局将决定这ListView每行内容的布局,最终展示什么样的效果完全由自己自定义这里我简单的将每个item布局设置为一张图片加一行文字,效果如效果图所示3.定义一个实体类(就是ListView中每个item要加载的数据)
public class item { private int tuResourceId; private String tv; public item(int tuResourceId,String tv){ this.tuResourceId=tuResourceId; this.tv=tv; } public String getTv(){ return tv; } public int getTuResourceId(){ return tuResourceId;} }就是创建一个简单的java类,这个实体类的作用就是存储每个item要加载的数据,每个item对应一个该实体类的对象这里我定义的item类中有两个字段,tv表示item中显示的文字,tuResourceId表示item中的图片资源id4.编写自定义适配器并重写其构造方法和getView()方法(难点+重要)前3步都非常的简单,容易理解,这一步相对前3步是有一定难度,同时也是ListView的核心,理解了这一步,那也就掌握了ListView下面这段代码我将会拆分注释讲解android里拥有好几种适配器,根据自己需要选用,这里我选中ArrayAdapter,适配器类里封装的方法都挺多的,非常方便,自己可以去查下API,然后根据自己的需要去决定重写方法我们先来看下android API中的ArrayAdapter给出的构造方法从图片可以看到,API中给出的构造方法有6个,具体情况根据自己需求去重写,这里我重写的是第5种我们来看下第5中的各个参数的含义
public class itemAdapter extends ArrayAdapter<item>{
private int resourceId; //将用于存放定义的item布局资源id
public itemAdapter(Context context, int Resource, List<item> objects) { super(context, Resource, objects); resourceId=Resource; } 这段阅读上面的截图就能够理解,就是重写构造方法,用于将上下文、ListView子项布局(就是item布局)的id和数据都传递进来,因为待会要用上public View getView(int position, View converView, ViewGroup parent){为什么要重写getView()?因为当用户滑动屏幕意图要加载更多数据时,getView()就会被调用,说白了就是ListView中的item显示到屏幕 前 就会调用
ImageView iv; TextView tv; View view; ViewHodler viewHodler;
定义一个内部类,ViewHodler的主要是为了提高ListView的运行速率,
可以往下拉,看到下面的具体定义的ViewHodler,可以看到,里面只有两个字段,一个是对应item布局里的图片资源id,一个是对应要显示的文字,那么从这里就可以看出,每个VIewHodler的对象即将对应一个item布局,接下来继续看下VIewHolder怎么去用
item im=getItem(position); if(converView==null){ //判断是否加载过item布局,converView为空,就证明该item布局没加载过 view= LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
这一句就是我需要获取到item布局,然后把它引进来(或者说动态加载都可以),获取到item布局的对象后,这样我们就可以找到每个对应item布局里的对应所有控件
当你在某个地方需要获取某个布局的应用时,这时候就可以用到LayoutInflater类,该类中封装的方法由from(getContext())(getContext()是获取当前上下文)返回一个LayoutInglater对象,然后再调用inflate(resourceId,parent,false)返回一个需要加载的布局对象,参数中resourceId对应Item布局的id,parent则对应item布局的父布局,第三个参数是决定是否将item布局表示添加到父布局中(将第一个参数所指定的布局添加到第二个参数的View中)
viewHodler=new ViewHodler(); viewHodler.itemTv=(TextView) view.findViewById(R.id.tv);
viewHodler.itemIv=(ImageView)view.findViewById(R.id.tu); view.setTag(viewHodler);
实例化viewHodler后,然后将item布局中的控件id对应的赋值到viewHodler的成员变量中
然后将每个viewHoder存储到对应的view(item布局)中
}else{ view=converView; viewHodler=(ViewHodler) view.getTag(); } viewHodler.itemTv.setText(im.getTv());
viewHolder.itemIv.setImageResource(im.getTuResourceId());
上面这段就是通过viewHolder去对item布局里的控件进行设置,非常容易理解,相信看到这里,ViewHoler的作用已经非常清楚了
return view; } class ViewHodler{ // private TextView itemTv;
private ImageView itemIv; } } }
最后一步,如何将ListView配合适配器使用
public class MainActivity extends AppCompatActivity { private ImageView iv; private List<item> itemList=new ArrayList<>(); private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=(ListView) findViewById(R.id.lv); init(itemList); itemAdapter adapter=new itemAdapter(MainActivity.this,R.layout.myitem,itemList);参数对应 上下文,myitem就是我自定义的item布局,需要加载的数据,大家可以看回定义适配器类重写构造方法那一块代码,相信会有自己的理解和认识 listView.setAdapter(adapter); iv.s } public void init(List<item> itemList){ item im; for(int i=0;i<10;i++){ im=new item(R.drawable.tu1,"This is my item "); itemList.add(im); } }
这一段没有太多东西要解释,就是简单的java里的集合使用和一些方法的调用,好啦,到这里就结束啦!希望可以帮到一起学习的小伙伴!
我下篇文章将会是RecylerView的简单应用