ListView 列表视图
16lz
2021-12-04
一、特点:
垂直滚动列表,是ViewGroup(容器),列表项使用Adapter填充二、属性
android:divider="@drawable/qdhline" item之间的分割线 可以用颜色#RGB 还可以用图片
android:dividerHeight="5dp" 分割线的间距(高度)
三、填充方式
1, 属性填充: android:entries="@array/books"2, 用ArrayAdapter
3, 用SimpleAdapter
4, 使用BaseAdapter
四、自定义适配器 BaseAdapter的用法
1,创建一个类继承BaseAdapter2,实现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,有数据不展示Viewlv.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;}}
更多相关文章
- 【Android】数据存储之Network
- Android中自定义switch控件样式
- Android学习笔记-界面和数据存储以及一些零碎知识点
- Android获取语言及地区总结
- android EditText 属性
- day02 数据存储和界面展现(1)
- android edittext的属性
- [Android(安卓)特效] Android(安卓)通过流播放声音(一)
- android 中的url操作