ListView 列表视图

一、特点:

垂直滚动列表,是ViewGroup(容器),列表项使用Adapter填充


二、属性


android:divider="@drawable/qdhline" item之间的分割线   可以用颜色#RGB 还可以用图片
        android:dividerHeight="5dp"   分割线的间距(高度)


三、填充方式

1,    属性填充:     android:entries="@array/books"


2,    用ArrayAdapter 


3,    用SimpleAdapter


4,    使用BaseAdapter



四、自定义适配器    BaseAdapter的用法

 1,创建一个类继承BaseAdapter
 2,实现BaseAdapter里的方法
  getCount():获取数据总长度
  getItem(int position)获取当前下标item的数据
  getItemId(int position) 获取当前下标item的id  如果实体类里有从实体类里获取  没有 position
  getView(int position, View convertView, ViewGroup parent)  返回当前下标item的视图
  



五、ListView的事件

1,点击事件    onItemClickListener()


2,长点击事件(0.18s)onItemLongClickListener()
返回值:true 只执行长点击事件   返回false  执行长点击和其他事件


六、ListVIew数据为空时:

lv中没有数据时展示View,有数据不展示View
lv.setEmptyView(tv);



七、 ListView 添加头(布局和原本的item样式不一致)  和添加尾

//获取头布局
View headerView = getLayoutInflater().inflate(R.layout.header_layout, null);
//头布局中控件的事件监听
ImageView ivHeader = (ImageView) headerView.findViewById(R.id.iv_header);
ivHeader.setOnClickListener(this);

//listView 添加头布局
lv.addHeaderView(headerView);

//listView 添加尾
View footView = getLayoutInflater().inflate(R.layout.footer_layout, null);
lv.addFooterView(footView);


六、  ListView的优化

1,在xml布局中给ListView设置固定的宽高   match_parent 不建议使用wrap_content
2,复用convertView  减少创建item布局对象次数  ( 当顶部item出去 新的item的就是使用顶部出去的item)

3,使用ViewHolder 减少查找控件的次数(将控件打包ViewHolder,将ViewHolder放到convertView当convertView不为空时将ViewHolder取出)


七、例题:

MainActivity

package com.qf.day08_listview_demo3_baseadapter;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.qf.day08_listview_demo3_baseadapter.adapter.MyBaseAdapter;
import com.qf.day08_listview_demo3_baseadapter.bean.Data;

public class MainActivity extends Activity implements OnClickListener{
	
	
	private ListView lv;
	private List list;
	
	private MyBaseAdapter adapter;
	
	private TextView tv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//获取控件
		lv = (ListView) findViewById(R.id.lv);
		//没有数据时展示
		tv = (TextView) findViewById(R.id.tv);
//		
//		//获取头布局
//		View headerView = getLayoutInflater().inflate(R.layout.header_layout, null);
//		
//		//头布局中控件的事件监听
//		ImageView ivHeader = (ImageView) headerView.findViewById(R.id.iv_header);
//		ivHeader.setOnClickListener(this);
//		
//		//listView 添加头布局
//		lv.addHeaderView(headerView);
//		
//		//listView 添加尾
//		View footView = getLayoutInflater().inflate(R.layout.footer_layout, null);
//		lv.addFooterView(footView);
//		
		//获取数据源
		getData();
		
		//获取Adapter实例
		adapter = new MyBaseAdapter(list, MainActivity.this);
		
		//将数据展示到ListView
		lv.setAdapter(adapter);
		
		//lv中没有数据时展示View,有数据不展示View
		lv.setEmptyView(tv);
		
		//listView item 点击事件
		lv.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "==>"+position, Toast.LENGTH_SHORT).show();
				//将数据清空
//				list.removeAll(list);
//				//更新adapter(刷新界面)
//				adapter.notifyDataSetChanged();
			}
		});
		
		//item的长点击监听方法
		lv.setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "长点击:"+list.get(position).getTitle(), Toast.LENGTH_SHORT).show();
				
				//长点击:0.18s  如果返回值false  长按事件和其他事件都处理     如果返回值true  只处理长按事件
				return true;
			}
		});
		
		
	}
	
	public void getData(){
		list = new ArrayList();
		for(int i=0;i<50;i++){
			list.add(new Data(R.drawable.ic_launcher, "title"+i, "desc"+i));
		}
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		//Toast.makeText(MainActivity.this, "点击header", Toast.LENGTH_SHORT).show();
	}


	
	

	

}



Data(实体类):

package com.qf.day08_listview_demo3_baseadapter.bean;

public class Data {
	
	private int imagUrl;//图片地址
	private String title;//标题
	private String desc;//内容
	
	
	
	public Data(int imagUrl, String title, String desc) {
		super();
		this.imagUrl = imagUrl;
		this.title = title;
		this.desc = desc;
	}
	public int getImagUrl() {
		return imagUrl;
	}
	public void setImagUrl(int imagUrl) {
		this.imagUrl = imagUrl;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getDesc() {
		return desc;
	}
	public void setDesc(String desc) {
		this.desc = desc;
	}
	
	
	

}



MyBaseAdapter

package com.qf.day08_listview_demo3_baseadapter.adapter;

import java.util.List;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.qf.day08_listview_demo3_baseadapter.R;
import com.qf.day08_listview_demo3_baseadapter.bean.Data;

/**
 * 1,创建一个类继承BaseAdapter 2,实现BaseAdapter里的方法 getCount():获取数据总长度 getItem(int
 * position)获取当前下标item的数据 getItemId(int position) 获取当前下标item的id 如果实体类里有从实体类里获取
 * 没有 position getView(int position, View convertView, ViewGroup parent)
 * 返回当前下标item的视图
 * 
 */

public class MyBaseAdapter extends BaseAdapter {

	private List list;
	private Context context;

	public MyBaseAdapter(List list, Context context) {
		this.list = list;
		this.context = context;
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub

		Log.e("AAA", "===position==" + position + "==convertView=="
				+ convertView);
		// ********************* 第一次:没有优化************************
		// //布局找到
		// View view = LayoutInflater.from(context).inflate(R.layout.item,
		// parent, false);
		//
		// //找到控件
		// ImageView iv = (ImageView) view.findViewById(R.id.iv);
		// TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
		// TextView tvDesc = (TextView) view.findViewById(R.id.tv_desc);
		//
		// //控件设置数据
		// Data data = list.get(position);
		// iv.setImageResource(data.getImagUrl());
		// tvTitle.setText(data.getTitle());
		// tvDesc.setText(data.getDesc());
		//
		// ********************第二种优化***************************************
		// if (convertView == null) {
		// convertView = LayoutInflater.from(context).inflate(R.layout.item,
		// parent, false);
		// // 布局找到
		// // View view = LayoutInflater.from(context).inflate(R.layout.item,
		// // parent, false);
		// }
		//
		// // 找到控件
		// ImageView iv = (ImageView) convertView.findViewById(R.id.iv);
		// TextView tvTitle = (TextView)
		// convertView.findViewById(R.id.tv_title);
		// TextView tvDesc = (TextView) convertView.findViewById(R.id.tv_desc);
		//
		// // 控件设置数据
		// Data data = list.get(position);
		// iv.setImageResource(data.getImagUrl());
		// tvTitle.setText(data.getTitle());
		// tvDesc.setText(data.getDesc());

		// ***********************第三种优化***************************************

		// 声明持有控件class(箱子)
		ViewHolde viewHolde = null;

		if (convertView == null) {
			convertView = LayoutInflater.from(context).inflate(R.layout.item,
					parent, false);

			// 持有控件的class(箱子)实例化
			viewHolde = new ViewHolde();

			// 将持有控件的class(箱子)里的控件 找到
			// 找到控件
			viewHolde.iv = (ImageView) convertView.findViewById(R.id.iv);
			viewHolde.tvTitle = (TextView) convertView
					.findViewById(R.id.tv_title);
			viewHolde.tvDesc = (TextView) convertView
					.findViewById(R.id.tv_desc);

			// 将持有控件的class(箱子) 放到item里(车里)
			convertView.setTag(viewHolde);

		} 
//		else {
//			// convertView不为空
//			// 持有控件的class(箱子)从convertView拿出来
//			viewHolde = (ViewHolde) convertView.getTag();
//		}

		// 控件设置数据
		Data data = list.get(position);
		viewHolde.iv.setImageResource(data.getImagUrl());
		viewHolde.tvTitle.setText(data.getTitle());
		viewHolde.tvDesc.setText(data.getDesc());

		return convertView;
	}

	// 持有控件的class(箱子)
	class ViewHolde {
		ImageView iv;
		TextView tvTitle;
		TextView tvDesc;
	}

}





你可能感兴趣的:(Android)