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;
}
}*/
}