android ListView之——BaseAdapter使用
来源:互联网 发布:联通网络信号怎么样 编辑:程序博客网 时间:2024/05/01 19:05
由于ArrayAdapter和BaseAdapter很多时候是满足不了我们的需求的,现在来介绍一下最最最常用也是很灵活的自定义适配器:BaseAdapter。
首先来了解一下ListView的工作原理:
ListView工作时,会针对每一个item要求Adapter对象返回一个View(其实也就是getView()方法),也就是说,ListView在开始绘制的时候,系统会首先调用getCount()方法,根据其返回的值得到ListView的长度,然后根据这个长度一行一行的绘制每个item,这也就是说getCount()到多少,就显示几行。但是由于ListView中有多少项,就会调用多少次getView()方法去绘制一个item,所以说如果数量过多的话,会极大地占用系统内存,这样子就必须采用性能优化。
搞清楚了ListView的工作原理,现在我们来看一下其缓存机制:
①当数目过多时,只将可见项存在内存中,其他的都在Recycler中吗,Recycler是Android中专门用来处理缓存的组件。
②ListView先通过getView()方法请求一个View,然后再请求其他可见的View,convertView在getView中是null。
③当列表第一项滚出屏幕,并且一个新的项从屏幕顶端划上来的时候,ListView会再请求一个View,这时候convertView已经不是空值了,它的值是滚出屏幕的那一项,之后只需设定新的数据,然后返回convertView即可,而不必重新创建一个View。
通过这种缓存机制,大大减少了创建新的View的次数,从而提升了ListView的性能。2009年的Google IO大会上给出了ListView的优化建议,下面我们来看代码:
自定义的适配器:MyBaseAdapter.java
import java.util.List;import android.content.Context;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.example.practice.R;import com.example.practice.domino.StudentInfo;public class MyBaseAdapter extends BaseAdapter { private List<StudentInfo> list; private LayoutInflater inflater; public MyBaseAdapter(Context context, List<StudentInfo> list) { this.list = list; inflater = LayoutInflater.from(context); } /** * 必须得到真实的数据源数目,否则数据适配会出现问题 */ @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int id) { return id; } /** * ListView每绘制一个item都会调用一次该方法。 * convertView和ViewHolder共同完成缓存机制,优化性能。 */ @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; ViewHolder holder; if (view == null) { view = inflater.inflate(R.layout.listview_item_base, null); holder = new ViewHolder(); // 这儿相当于每一个item的视图布局 holder.baseAdapter_iv_icon = (ImageView) view .findViewById(R.id.baseAdapter_iv_icon); holder.baseAdapter_tv_id = (TextView) view .findViewById(R.id.baseAdapter_tv_id); holder.baseAdapter_tv_name = (TextView) view .findViewById(R.id.baseAdapter_tv_name); holder.baseAdapter_tv_major = (TextView) view .findViewById(R.id.baseAdapter_tv_major); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } // 这里是给item布局适配的数据 holder.baseAdapter_iv_icon .setImageResource(list.get(position).getImg()); holder.baseAdapter_tv_id.setText("id: " + list.get(position).getId()); holder.baseAdapter_tv_name.setText("name: " + list.get(position).getName()); holder.baseAdapter_tv_major.setText("major: " + list.get(position).getMajor()); return view; } /** * ViewHolder实现缓存机制 * */ private static class ViewHolder { private ImageView baseAdapter_iv_icon; private TextView baseAdapter_tv_id; private TextView baseAdapter_tv_name; private TextView baseAdapter_tv_major; }}
主Activity:BaseAdapter_Aty.java
import java.util.ArrayList;import java.util.List;import com.example.practice.R;import com.example.practice.domino.StudentInfo;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;public class BaseAdapter_Aty extends Activity { private ListView listView; private List<StudentInfo> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview_aty); listView = (ListView) findViewById(R.id.listView); list = new ArrayList<StudentInfo>(); initData(); MyBaseAdapter adapter = new MyBaseAdapter(this, list); listView.setAdapter(adapter); } /** * 初始化数据,用来适配给ListView。 * 模拟的假数据,为方便是通过for循环生成的。 * 在实际应用中的数据源可以是使用网络编程从服务器获取的,也可以是数据库中查询的。 */ private void initData() { for (int i = 0; i < 100; i++) { StudentInfo stu = new StudentInfo(); stu.setImg(R.drawable.ic_launcher); stu.setId(20150000 + i); stu.setName("name" + i); stu.setMajor("major" + i); list.add(stu); } }}
数据模型Bean文件:StudentInfo.java
public class StudentInfo { private int id; private String name; private String major; private String account; private int img; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public int getImg() { return img; } public void setImg(int img) { this.img = img; } @Override public String toString() { return "StudentInfo [id=" + id + ", name=" + name + ", major=" + major + ", account=" + account + "]"; }}
布局文件:
listview_aty.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="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView></LinearLayout>
listview_item_base.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/baseAdapter_iv_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="32dp" /> <TextView android:id="@+id/baseAdapter_tv_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="32dp" android:layout_marginTop="8dp" android:layout_toRightOf="@+id/baseAdapter_iv_icon" android:text="id" /> <TextView android:id="@+id/baseAdapter_tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/baseAdapter_tv_id" android:layout_below="@+id/baseAdapter_tv_id" android:layout_marginTop="8dp" android:text="name" /> <TextView android:id="@+id/baseAdapter_tv_major" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/baseAdapter_tv_name" android:layout_below="@+id/baseAdapter_tv_name" android:layout_marginTop="8dp" android:text="major" /></RelativeLayout>
这样一来会发现ListView的滑动会流畅很多。
- android ListView之——BaseAdapter使用
- Android杂谈--ListView之BaseAdapter的使用
- Android杂谈--ListView之BaseAdapter的使用
- Android杂谈--ListView之BaseAdapter的使用
- Android ListView之BaseAdapter的使用
- Android杂谈--ListView之BaseAdapter的使用
- Android杂谈--ListView之BaseAdapter的使用
- android ListView之BaseAdapter的使用方式
- Android杂谈--ListView之BaseAdapter的使用
- Android杂谈--ListView之BaseAdapter的使用
- Android杂谈--ListView之BaseAdapter的使用
- Android中ListView之BaseAdapter的使用
- android AbsListView之ListView使用(2)-BaseAdapter
- Android杂谈--ListView之BaseAdapter的使用
- Android杂谈--ListView之BaseAdapter的使用
- android 中listview之BaseAdapter的使用
- android 中listview之BaseAdapter的使用
- Android--ListView之BaseAdapter的使用
- Android API Guides –System Permissions
- 8.18学习总结
- maven 自定议archetype设置
- 编写大规模的C语言程序
- VS2012自带的 性能分析 工具使用实例
- android ListView之——BaseAdapter使用
- 采集ajax加载生成的网页
- .Net 雜談
- Leetcode#74||Search a 2D Matrix
- 深度学习(deep learning)如果有春天,先得摆脱高能耗高资源依赖的局面
- Linux————TCP/IP协议
- 基于深度优先算法的有向图环路检测
- 消息MSG、 获取消息GetMessage、消息过滤、第一个鼠标、键盘消息等
- Android点击应用Icon发生了什么