ListView 的显示优化有好多种,通常有遇到 ListView 嵌套 EditText 进行显示错位问题,原因就是没有合理做好优化,通常的ListView的优化是这样写的:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = View.inflate(getApplicationContext(), R.layout.item_act, null);
holder = new ViewHolder();
holder.et = (EditText) convertView.findViewById(R.id.ev);
holder.tv = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}else{
convertView = mMap.get(position);
}
String string = mData.get(position);
holder.tv.setText(string);
return convertView;
}
但是,如果有EditText这样写就不行了,会出现显示错位。下面是另一种优化方法:
public class MainActivity extends Activity {
private ListView mLv;
private List<String> mData;
private MyAdapter mAdapter;
@SuppressLint("UseSparseArrays")
private HashMap<Integer, View> mMap = new HashMap<Integer, View>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLv = (ListView) findViewById(R.id.lv);
initData();
}
private void initData() {
mData = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
mData.add("AA : " + i);
}
mAdapter = new MyAdapter();
mLv.setAdapter(mAdapter);
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
ViewHolder holder = null;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if(mMap.get(position) == null){
convertView = View.inflate(getApplicationContext(), R.layout.item_act, null);
holder = new ViewHolder();
holder.et = (EditText) convertView.findViewById(R.id.ev);
holder.tv = (TextView) convertView.findViewById(R.id.tv);
mMap.put(position, convertView);
convertView.setTag(holder);
}else{
convertView = mMap.get(position);
holder = (ViewHolder) convertView.getTag();
}
String string = mData.get(position);
holder.tv.setText(string);
return convertView;
}
}
private class ViewHolder{
EditText et;
TextView tv;
}
}
采用Map的方式进行缓存每个View,这样就可以啦