一、特点:

垂直滚动列表,是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;@Overrideprotected 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);//将数据展示到ListViewlv.setAdapter(adapter);//lv中没有数据时展示View,有数据不展示Viewlv.setEmptyView(tv);//listView item 点击事件lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "==>"+position, Toast.LENGTH_SHORT).show();//将数据清空//list.removeAll(list);////更新adapter(刷新界面)//adapter.notifyDataSetChanged();}});//item的长点击监听方法lv.setOnItemLongClickListener(new OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {// TODO Auto-generated method stubToast.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));}}@Overridepublic 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;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubLog.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;}}





更多相关文章

  1. day02 数据存储和界面展现(1)
  2. Android中的5种数据存储方式
  3. 横竖屏布局小技巧
  4. android中listview控件覆盖了其它控件使下面的其它控件不显示
  5. Android中登录布局展示Activity
  6. 自定义控件 - 圆形缓冲进度条
  7. android 变长数据GSON解析
  8. 经典——Android 布局

随机推荐

  1. Android JNI cpp文件创建 java bean 对象
  2. Android转场动画windowAnimation和Activi
  3. Android中SQLiteOpenHelper类的onUpgrade
  4. Studio 1.5模拟器启动错误android/metric
  5. HashMap 的 7 种遍历方式与性能分析!(强烈
  6. Android引用百度定位API第三方组件后导致
  7. 开发Android平板电脑程序不能全屏显示问
  8. Android消息通知
  9. Android 桌面组件
  10. Android 抽屉侧滑效果