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界面.
本文为个人原创,转载请注明出处