ListView的优化 +BaseAdapter适配器

一 . 概念:

首先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对象实例化的次数。减少内存开销,提高性能。

④convertViewsetTag()

        利用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>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值