Android基础知识——ListView

在应用程序中常常出现这样的activity,有多条信息,每一条信息有标识图片、标题等内容,比如新闻菜单、设置选项qq好友选项等等,使用组件ListView可以实现这样的功能


如何实现一个这样的ListView:

1 创建ListViewActivity类(当然也可以继承一般的Activity,但是需要在类中自定义一个ListView)

需要注意的是,如果要使用自定义的布局,则需要通过setContentView(int id);和xml配置文件实现通信,xml配置见后文第三步

public class PictureAndTxtListAty extends ListActivity implements OnItemClickListener{
	
	private TextView tv;
	private PicAndTxtListViewAdapter adapter;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);
		setContentView(R.layout.picandtext_listview);
                //设置适配器
                adapter = new PicAndTxtListViewAdapter(this);
		setListAdapter(adapter);
                //创建组件实例
                tv = (TextView) findViewById(R.id.title_pat);
                //为每一栏添加响应
                this.getListView().setOnItemClickListener(this);
	}
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {

		PicAndTxtCell data = adapter.getItem(position);
		Toast.makeText(this,String.format("姓名:%s  生日:%s",data.name,data.date),Toast.LENGTH_SHORT).show();
	}	
}
其中toast会出现这样一个提示栏的效果

2 在AndroidManifest.xml文件中配置相关节点,如果需要以本Activity为应用程序第一个界面,则

需要在其<Intent filter>中做相关配置

<activity
            android:name="com.yunxiang.diandi.activitys.PictureAndTxtListAty"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
 </activity>

3 为ListViewActity配置布局(如果需要的话)

<1>创建相关xxx_listview.xml,不过需要注意的是这个xml文件中一定要包含一个ListView组件,而且使用系统提供的id:  android:id="@android:id/list"

<2>配置布局,添加需要的组建:textview button等

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/title_pat"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=" XXXXXXX" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </ListView>
    
</LinearLayout>

4 创建每一栏的数据类,用来临时储存每一栏的有关信息

public class PicAndTxtCell {

	public PicAndTxtCell(String name,String date,int id) 
	{
		this.name=name;
		this.date=date;
		this.iconId=id;
	}
	public String name="";
	public String date="";
	public int iconId=0;
	
}


5 创建cell_layout xml文件为每一栏配置布局,这里采用的是图标+列表的形式

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:id="@+id/pat_listcell" >

     <ImageView
        android:layout_width="90dp"
        android:layout_height="90dp" 
        android:id="@+id/icon"> 
    </ImageView>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Name"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <TextView
            android:id="@+id/description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Description" />

    </LinearLayout>

</LinearLayout>


6 创建BaseAdapter类,完成总表的控制

关于BaseAdapter的说明

<1>有4个必须实现的抽象方法

public int getCount();
用来返回列表元素的总数量
public PicAndTxtCell getItem(int position);
返回数据元

public long getItemId(int position);
返回数据元ID

public View getView(int position, View convertView, ViewGroup parent);
返回一栏给ListView

position是一个迭代器,用于遍历源数据集

convertView 是安卓平台提供的内存优化机制,类似与可利用线性表的作用,从对象池中重新引用废弃对象,从而不用重新创建

(具体是什么数据结构我也不清楚。。。有兴趣的同志可以去看看源代码。。。)

parent是什么呢?欢迎补充= =

关于

ll = (LinearLayout) LayoutInflater.from(this.getContext()).inflate(R.layout.pictureandtext_listcell, null);
引用一句话:它的作用类似于findViewById(),创建一个组件实例。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

获得 LayoutInflater 实例的三种方式
1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater() 
2. LayoutInflater inflater = LayoutInflater.from(context);  
3. LayoutInflater inflater =  (LayoutInflater)context.getSystemService
这里采用了第二种,从创建ListView的Content中获取。

public class PicAndTxtListViewAdapter extends BaseAdapter {

	private Context context;
	public PicAndTxtListViewAdapter(Context context) {
		this.context=context;
	}
	public Context getContext() {
		return context;
	}
	public void setContext(Context context) {
		this.context = context;
	}
	private PicAndTxtCell[] data = {
			new PicAndTxtCell("XXX", "xxxx-x", R.drawable.image_2),
			new PicAndTxtCell("XXX", "xxxx-x", R.drawable.image_2),
			new PicAndTxtCell("XXX", "xxxx-x", R.drawable.image_1)
	};
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		 

		PicAndTxtCell data = getItem(position);
		
		LinearLayout ll  = null;
		if(convertView!=null)
		{
			ll = (LinearLayout)convertView;
		}
		else
		{
			
			ll = (LinearLayout) LayoutInflater.from(this.getContext()).inflate(R.layout.pictureandtext_listcell, null);
			
		}
		ImageView im = (ImageView) ll.findViewById(R.id.icon);
		TextView name = (TextView) ll.findViewById(R.id.name);
		TextView dec = (TextView) ll.findViewById(R.id.description);
		
		im.setImageResource(data.iconId);
		name.setText(data.name);
		dec.setText(data.date);
	
		return ll;
	}
	
	@Override
	public long getItemId(int position) {
		return position;
	}
	
	@Override
	public PicAndTxtCell getItem(int position) {
		return data[position];
	}
	
	@Override
	public int getCount() {
		return data.length;
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值