由于在listview当中,当项目超过一个屏幕的大小时会滑出第二屏,这时第二屏会重新利用前一屏的视图,如果前一屏中list的某一项状态发生改变的话会影响后面所有的项,从而出现视图混乱的情况,那么如何来解决这一问题呢?核心就是用记住这个list中所有项的状态,根据这个状态来刷新视图。举个简单例子:
由于布局很简单,我这里只做简单描述。每一项list含一个TextView和一个Button,现在要根据TextView中text的值来改变button的状态。
直接上代码
package com.example.testlistview;
import junit.framework.Test;
import android.R.integer;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
int[] test = { 1, 2, 3, 2, 2, 2, 2, 3, 3, 2, 1, 2, 3, 1, 2, 3, 1, 2, 1, 2,
3 ,2,3,1,3,2,1,3,1,1,1,3,3,3,1,2,3,1,1,1,1,1,3,3,3,2,2,3,1,2};//1,2,3分别代表button的三种状态
ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView=(ListView)findViewById(R.id.mylist);
MyAdapter mMyAdapter=new MyAdapter();
mListView.setAdapter(mMyAdapter);
}
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return test.length;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return test[arg0];
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup arg2) {
// TODO Auto-generated method stub
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(MainActivity.this).inflate(
R.layout.item_layout, null);
holder = new ViewHolder();
holder.textView = (TextView) convertView
.findViewById(R.id.mytext);
holder.button = (Button) convertView
.findViewById(R.id.mybutton);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(test[position]+" ");
holder.button.setBackgroundResource(setBeijing(test[position]));//test[position]记录了当前位置button的状态
return convertView;
}
}
public int setBeijing(int code){//根据code来改变背景
int result = 0;
switch (code) {
case 1:
result=R.drawable.ic_launcher;
break;
case 2:
result=R.drawable.bt_login;
case 3:
break;
default:
break;
}
return result;
}
class ViewHolder {
TextView textView;
Button button;
}
}