我有一个代码,用户会看到一个项目列表。切换按钮位于列表项旁边。因此,当用户设置切换时,将触发警报。现在的问题是,当我滚动到列表视图的底部并再次返回到第一个项目时,我在列表中设置第一个项目的切换按钮时它会消失和/或重置。我完全很困惑,设置这个选择留在那里。请求此论坛中的某人帮助我。
我的班级CSVAdapter。我附在这里。
public class CSVAdapter extends ArrayAdapter<clock>{
Context ctx;
String line;
int position=-1;
ViewHolder myviewholder;
mrvtoparanur mp;
clock clk;
HashMap<Integer, Boolean> btnstate=new HashMap<Integer,Boolean>();
public CSVAdapter(Context context,int textViewResourceId, ArrayAdapter<clock> clk)
{
super (context,R.layout.checkbox,textViewResourceId);
this.ctx = context;
loadArrayFromFile();
}
static class ViewHolder
{
TextView text;
ToggleButton tb;
}
@Override
public View getView(final int pos,View convertView,final ViewGroup parent){
View row=convertView;
if(row==null){
LayoutInflater vi=(LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row=vi.inflate(R.layout.checkbox, parent,false);
myviewholder.text=(TextView)convertView.findViewById(R.id.code);
myviewholder.tb=(ToggleButton)convertView.findViewById(R.id.checkBox1);
myviewholder=new ViewHolder();
position=pos;
row.setTag(myviewholder);
//Log.d("KEY", "VIEW CREATED NEWLY");
//myviewholder.tb.setChecked(btnstate.get(pos));
}
else
{
myviewholder=(ViewHolder)convertView.getTag();
Log.d("KEY", "VIEW RECYCLED");
btnstate.size();
btnstate.put(position, true);
}
myviewholder.text.setText(getItem(pos).getTime());
myviewholder.tb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
//myviewholder.tb.setChecked(btnstate.get(position));
btnstate.putAll(btnstate);
btnstate.put(position, true);
}
});
return row;
}
private void loadArrayFromFile(){
try
{
InputStream is=ctx.getAssets().open("mrvtoparanur.csv");
BufferedReader reader=new BufferedReader(new InputStreamReader(is));
//Read each line
while((line = reader.readLine())!=null){
clock cur = new clock();
cur.setTime(line);
this.add(cur);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
有不同的方法可以实现这一目标。一种方法是创建成员变量ArrayList
。像
private HashMap<Integer, Boolean> btnState = new HashMap<Integer, Boolean>();
然后当按钮状态为真时,我position
getView()
并将其添加为true
。然后在getView()
检查每次该位置的项目是真还是假,并设置具有该值的状态。
public View getView(int pos,View convertView,final ViewGroup parent){
...
myviewholder.tb.setChecked(btnState.get(position);
显然,在您的onCheckChangedListener
中,您需要将值添加到列表中
btnState.put(position, isChecked); // is checked is whatever value you use in your listener
您也可以使用SparseBooleanArray或ArrayList
,但我相信HashMap
无论出于何种原因都能满足我的需求。