滚动列表视图上的切换按钮重置

时间:2014-05-30 01:23:07

标签: android listview togglebutton android-viewholder

我有一个代码,用户会看到一个项目列表。切换按钮位于列表项旁边。因此,当用户设置切换时,将触发警报。现在的问题是,当我滚动到列表视图的底部并再次返回到第一个项目时,我在列表中设置第一个项目的切换按钮时它会消失和/或重置。我完全很困惑,设置这个选择留在那里。请求此论坛中的某人帮助我。

我的班级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();
        }

}
}

1 个答案:

答案 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

您也可以使用SparseBooleanArrayArrayList,但我相信HashMap无论出于何种原因都能满足我的需求。