listview重载问题的解决思路

listview是Android开发中相当常用的控件,但是使用过程中也有不少问题需要注意,本文介绍一下listview的重载以及解决方法,

package com.example.listview;

import java.util.zip.Inflater;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
	ListView lv;
	String sz[]=new String[20];
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		lv=(ListView)findViewById(R.id.lv);
		for(int i=0;i<sz.length;i++){
			sz[i]="米老头多滋纤麦"+i;
		}
		mAdapter adapter = new  mAdapter(this, sz);
		lv.setAdapter(adapter);


	}

	class mAdapter extends BaseAdapter{
		Context context;
		String []sz;

		public mAdapter(Context context, String[] sz) {
			super();
			this.context = context;
			this.sz = sz;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return sz.length;
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return sz[position];
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}
		/***
		 * listview基本的优化方法,使用viewholder来保存控件,下次使用直接获取
		 */
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			Holder holder=null;
			if(convertView==null){
				holder=new Holder();
				convertView	= View.inflate(getApplicationContext(), R.layout.item, null);
				holder.textView = (TextView)convertView.findViewById(R.id.tv);
				//此处下一个item重用时会直接获取被重用的item的值,导致重载
				holder.editText = (EditText)convertView.findViewById(R.id.et);
				convertView.setTag(holder);
			}else{
				holder=(Holder) convertView.getTag();
			}
			holder.textView.setText(sz[position]);
			return convertView;
		}
	}   


	class Holder{
		TextView textView;
		EditText editText;
		public TextView getTextView() {
			return textView;
		}
		public void setTextView(TextView textView) {
			this.textView = textView;
		}
		public EditText getEditText() {
			return editText;
		}
		public void setEditText(EditText editText) {
			this.editText = editText;
		}

	}

}

上面是重载的代码,下面我们看一下解决的办法,这种方法,第一次加载的时候效率有些低,之后每次就和使用Holder的效率是一样的

package com.example.listview;

import java.util.ArrayList;
import java.util.zip.Inflater;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
	ListView lv;
	String sz[]=new String[20];

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		lv=(ListView)findViewById(R.id.lv);
		for(int i=0;i<sz.length;i++){
			sz[i]="米老头多滋纤麦"+i;
		}
		mAdapter adapter = new  mAdapter(this, sz);
		lv.setAdapter(adapter);


	}

	class mAdapter extends BaseAdapter{
		private Context context;
		private		String []sz;
		private ArrayList<View>list;

		public mAdapter(Context context, String[] sz) {
			super();
			this.context = context;
			this.sz = sz;
			list=new ArrayList<View>();
			for(int i=0;i<sz.length;i++){
				list.add(null);
			}
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return sz.length;
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return sz[position];
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}
		/***
		 * listview基本的优化方法,使用viewholder来保存控件,下次使用直接获取
		 */
		/**
		 * 为了避免重载,不能使用holder,使用集合的方法
		 */
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			//重点在此处,不是使用convertview判断
			View view = list.get(position);
			if(view==null){
				convertView	= View.inflate(getApplicationContext(), R.layout.item, null);
				TextView textView = (TextView)convertView.findViewById(R.id.tv);
				//此处下一个item重用时会直接获取被重用的item的值,导致重载
				EditText editText = (EditText)convertView.findViewById(R.id.et);
				textView.setText(sz[position]);
				//每加载一次布局就放到集合中,下次直接使用
				list.set(position, convertView);
			}else{
				convertView=list.get(position);
			}
			/*Holder holder=null;
			if(convertView==null){
				holder=new Holder();
				convertView	= View.inflate(getApplicationContext(), R.layout.item, null);
				holder.textView = (TextView)convertView.findViewById(R.id.tv);
				//此处下一个item重用时会直接获取被重用的item的值,导致重载
				holder.editText = (EditText)convertView.findViewById(R.id.et);
				convertView.setTag(holder);
			}else{
				holder=(Holder) convertView.getTag();
			}
			holder.textView.setText(sz[position]);*/
			
			return convertView;
		}
	}   


	/*class Holder{
		TextView textView;
		EditText editText;
		public TextView getTextView() {
			return textView;
		}
		public void setTextView(TextView textView) {
			this.textView = textView;
		}
		public EditText getEditText() {
			return editText;
		}
		public void setEditText(EditText editText) {
			this.editText = editText;
		}

	}*/

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值