Android控件--定制ListView界面

0.前言

    学过Android的人,我想肯定使用该Android的ListView控件,毕竟当要显示列表的时候,例如qq的消息界面、聊天界面,手机显示联系人,这些无疑都是使用到了ListView
 这个Android最为常用的界面。那么接下来就谈谈如何自己创建一个适配器去订制ListView界面的。(注意:本文介绍的适用列表每一项的内容一样的情况)

1.在AndroidStudio新建Android工程

     工程中的Androidmanifest.xml保持不变

2.在main_activity中加入一个ListView控件,并且声明id

 

<ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"/>

3.新建一个布局文件item_activity.xml

     显示每个列表项要展示的内容,本例子展示的是一个图片,两个文本(一个表示文本标题,
 另一个表示的是文本内容),采用的是相对布局,文本内容位于文本标题的正下方
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/relative"
    android:paddingBottom="4dip"
    android:paddingLeft="12dip"
    android:paddingRight="12dip"
    >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:id="@+id/image"
        android:paddingTop="12dip"/>
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/itemTitle"
        android:text="TextView1"
        android:textSize="20dip"
        />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/itemText"
        android:text="TextView2"
        android:layout_below="@+id/itemTitle"
        />
</RelativeLayout>
以上已经介绍完整个例子的布局文件,接下来讨论的是使用Java代码去实现定制ListView界面的功能

4.在src中创建ListItem.java类

     这个类中的属性与item_activity.xml中的各个控件相对应,并且针对每个属性要写getter方法(可以在后面新建的适配器中使用它)
 1  package dragon.csu.edu.pojoj;
 2 
 3 public class ListItem {
 4     private int imageId;
 5     private String itemTitle;
 6     private String itemText;
 7 
 8     public ListItem(int imageId, String itemTitle, String itemText) {
 9         this.imageId = imageId;
10         this.itemTitle = itemTitle;
11         this.itemText = itemText;
12     }
13 
14     public int getImageId() {
15         return imageId;
16     }
17 
18     public String getItemTitle() {
19         return itemTitle;
20     }
21 
22     public String getItemText() {
23         return itemText;
24     }
25 }

5.在src中创建ListViewAdapter.java类

   这个就是本例子的重点了,首先要讲的是这个类要继承于ArrayAdapter这个类,这样就可以作为传入ListView的参数,不继承就无法进行;其次是内部类ListHoder,使用这个内部类的作用
就是可以当我们是第二次访问的时候,它会将第一次访问的ListView中的信息进行相应的保存,这无疑可以节省界面显示的时间,不用在进行数据的获取。具体详细内容中的解释,不过多介绍
 1 package dragon.csu.edu.util;
 2 
 3 import android.content.Context;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.ArrayAdapter;
 8 import android.widget.ImageView;
 9 import android.widget.TextView;
10 
11 import org.w3c.dom.Text;
12 
13 import java.util.List;
14 
15 import dragon.csu.edu.androidexample.R;
16 import dragon.csu.edu.pojoj.ListItem;
17 
18 public class ListViewAdapter extends ArrayAdapter<listitem> {
19     private int resourceId;//记录的是item_activity.xml的布局id
20     public ListViewAdapter(Context context,int resourceId1,List<listitem> listItems) {
21         super(context,resourceId1,listItems);
22         resourceId=resourceId1;
23     }
24     @Override
25     public View getView(int position, View convertView, ViewGroup parent){
26         ListItem listItem=getItem(position);
27         View view;
28         ViewHolder viewHolder;
29         //当用户为第一次访问的时候
30         if(convertView==null){
31             //将item_activity布局解析成显示界面
32             view = LayoutInflater.from(getContext()).inflate(resourceId,null);
33             viewHolder=new ViewHolder();
34             //获取item_activity.xml中控件,并将其保存在viewHolder中
35             viewHolder.imageView=(ImageView)view.findViewById(R.id.image);
36             viewHolder.itemTitle=(TextView)view.findViewById(R.id.itemTitle);
37             viewHolder.itemText=(TextView)view.findViewById(R.id.itemText);
38             //设置将数据进行缓存
39             view.setTag(viewHolder);
40         }else{
41             //第二次访问直接读取第一次访问使存取的数据
42             view=convertView;
43             viewHolder=(ViewHolder)view.getTag();
44         }
45         //将数据返回到item_activity.xml中的每一个空间中
46         viewHolder.imageView.setImageResource(listItem.getImageId());
47         viewHolder.itemTitle.setText(listItem.getItemTitle());
48         viewHolder.itemText.setText(listItem.getItemText());
49         return view;
50     }
51     class ViewHolder{
52         private ImageView imageView;
53         private TextView itemTitle;
54         private TextView itemText;
55     }
56 }
完成了以上的内容,就剩下最后一步了

6.编写MainActivity.java代码

当完成以上的代码,编写MainActivity.java就显得特别的简单
 1 package dragon.csu.edu.androidexample;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.widget.ListView;
 7 
 8 import java.util.ArrayList;
 9 import java.util.List;
10 
11 import dragon.csu.edu.pojoj.ListItem;
12 import dragon.csu.edu.util.ListViewAdapter;
13 
14 public class MainActivity extends Activity {
15     ArrayList<listitem> lists=new ArrayList<listitem>();
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.list_view_activity);
20         //得到listView
21         ListView listView=(ListView)findViewById(R.id.listView);
22         initListItem();//初始化数据
23         //第一个参数表示上下文,第二个表示要显示的布局id,第三个表示传入的参数
24         ListViewAdapter listViewAdapter=new ListViewAdapter(MainActivity.this,R.layout.
25                 item_activity,lists);
26         //将item_activity.xml中的布局导入ListView中
27         listView.setAdapter(listViewAdapter);
28     }
29     public void initListItem(){
30         ListItem list1=new ListItem(R.drawable.image5,"Level 1","1");
31         ListItem list2=new ListItem(R.drawable.image5,"Level 2","2");
32         ListItem list3=new ListItem(R.drawable.image5,"Level 3","3");
33         lists.add(list1);
34         lists.add(list2);
35         lists.add(list3);
36     }
37 
38 }
这样,就完成了定制ListView界面.
本文为个人原创,转载请注明出处

 

Android控件--定制ListView界面

上一篇:iOS 事件处理机制与图像渲染过程


下一篇:Installing Node.js & NPM on Ubuntu