一 . 概念:
首先ListView是一个ViewGroup,是一个以垂直方式在项目中显示View视图的列表。
他也是一个适配器视图,可以通过适当的适配器来让ListView展示数据。
与ListView配合使用的适配器主要包括下面几种:ArrayAdapter、SimpleAdapter、BaseAdapter(重点)、SimpleCursorAdapter(适配器与Cu rsor 的简单结合)。 可以毫不夸张的说,几乎任何的软件都会使用到ListView控件,所以该控件及其重要。
二 先说说ListView的实现大概思路 :
1.准备ListView要显示的数据;
2.使用一个List集合保存数据;
2.构建适配器,简单地来说,适配器就是Item数组,集合有多少元素就生成多少个Item;
3.把适配器添加到ListView,并显示出来。
三 ListView优化具体步骤如下:①.将布局中的listview控件的宽高固定,避免多次宽高的测量
android:layout_width="match_parent"
android:layout_height="match_parent"
②.利用ViewHolder将子视图布局中小控件封装,这样就把item中散在的多个控件合成一个整体,这样可以有效地避免图片错位。
3.1 定义一个ViewHolder类,在其中声明子视图中的所有小控件
3.2 在新加载子视图对象的情况下,将从子视图中找到的小控件保存到viewHolder对象中利用convertView的setTag方法,将viewHolder保存
3.3 在重复利用子视图的情况下,直接通过convertView的getTag方法,获得ViewHolder对象
3.4 从ViewHolder对象中获得小控件对象,给小控件对象设置数据即可.
③.利用BaseAdapter适配器的getView方法的convertView参数,重复利用convertView,这样可以减少填充布局的过程,减少ViewHolder对象实例化的次数。减少内存开销,提高性能。
④convertView的setTag():
利用setTag()方法将ViewHolder对象作为标签附加到convertView上,当convertView被重复利用的时候,因为上面有ViewHolder对象,所以convertView就具有了ViewHolder中的几个属性,这样就节省了findViewById()这个过程。
⑤.如果Listview中有图片的话,还要处理错位,二级采样,三级缓存问题,当然了,如果用Xutils框架的话,就没有这种烦恼了。⑥.终极优化,当我们快速滑动listview时,我们可以不加载数据,不适配到Listveiw上来节省流量。
四 代码展示:
public class MainActivity extends Activity { private List<String> dataList;<span style="font-family:comic sans ms,sans-serif;">//创建一个空的集合,用于存放显示的数据</span>
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listview);
initData();
MyDapter myDapter = new MyDapter(this,dataList);
listView.setAdapter(myDapter);//记得要把适配到的数据myDapter设置到listView上。</span>
}
private void initData() {
dataList = new ArrayList<String>();
for (int i = 0; i < 66; i++) {
dataList.add("明天取个小老婆"+i);
Log.e("1111111", dataList.toString());
}
}
}
②MyDapter的code
public class MyDapter extends BaseAdapter {
private List<String> dataList;<span style="font-family:comic sans ms,sans-serif;">//把list集合传送过来</span>
private Context context;<span style="font-family:comic sans ms,sans-serif;">//上下文对象</span>
public MyDapter(Context context, List<String> dataList) {
this.context = context;
this.dataList = dataList;
}
@Override
public int getCount() {
return dataList.size(); //集合中的个数</span>
}
@Override
public Object getItem(int position) {
return dataList.get(position);//存入集合
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {// View convertView可以复用的子视图对象 </span><pre name="code" class="java"><pre name="code" class="java"><span style="color:#000000;"><span style="font-family:comic sans ms,sans-serif;"> viewHolder</span></span><span style="color:#330000;"><span style="font-family:comic sans ms,sans-serif;"> viewholder</span> <span style="font-family:comic sans ms,sans-serif;">;</span>
if(convertView==null){//<span style="color:#FF0000;">1 如果系统自带的子视图的没有子布局,那就加载一个</span>
//1.1通过布局加载器得到一个子视图对象</span>
convertView = LayoutInflater.from(context).inflate(R.layout.item_activity, null);
//1.2从子布局中找到对象
TextView newtextView = (TextView) convertView.findViewById(R.id.item_textView);
//1.3创建Holder的对象
viewholder = new viewHolder();
//1.4将找到的控件赋值到Holder中
//1.5利用convertView的setTag方法,将创建出来的保存有子控件的存进去
convertView.setTag(viewholder);
//把子控件的子控件保存到convertView中,下次要用的就直接调用即可,不用重新加载,省去了不必要的耗时,从而得到优化的作用
}else {
//2.1如果有可以回收利用的子视图对象,直接重新设置数据,
//利用convertView的getTag方法找到其中的小控件,直接设置数据
holder = (Holder) convertView.getTag();
}
//3 通过viewHolder对象,获得其中的textview,修改textview的值
<span style="font-family:comic sans ms,sans-serif;">viewholder</span>.textView.setText(dataList.get(position));
Log.e("adapter", "重复利用:getView........"+position);
</span>
return convertView;}public class viewHolder {//1.定义类,封装子视图中的小控件TextView textView;}}
五 效果展示:
<font color="#000000"><font color="#000000" size="2"><span style="font-size:18px;color:#FF6666;"><span style="font-family:comic sans ms,sans-serif;"><span style="font-size:14px;"><img src="https://img-blog.csdn.net/20160430124400325?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span></span></span></font></font>