【问题标题】:Toggle button resets on scroll listview在滚动列表视图上重置切换按钮
【发布时间】:2014-05-30 01:23:06
【问题描述】:

我有一个代码,向用户显示项目列表。切换按钮放置在列表项旁边。因此,当用户设置切换时,就会触发警报。现在的问题是,当我在列表中设置第一项的切换按钮时,当我滚动到列表视图的底部并再次返回到第一项时,它消失和/或重置。我对将其设置为保持选中状态感到非常困惑。请求此论坛中的某人帮助我。

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

}
}

【问题讨论】:

标签: android listview togglebutton android-viewholder


【解决方案1】:

您可以通过不同的方式来实现这一点。一种方法是创建成员变量ArrayList。类似的东西

private HashMap<Integer, Boolean> btnState = new HashMap<Integer, Boolean>();

然后当按钮状态为真时,我们只需要在getView() 中添加position 并将其添加为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 最适合我的需求,无论出于何种原因。

【讨论】:

  • 感谢 CodeMagic !会尝试并回复您
  • 兄弟,我要逼近了。堆栈跟踪中的空指针异常。顺便说一句,我应该把你的代码放在哪里 myviewholder.tb.setChecked(btnState.get(position));在 getView 方法内部或 if(convertView==null) 内部?对这个感到困惑。需要你的帮助。
  • 哪条线路给你NPE,兄弟?你有onCheckChangedListener() 吗?如果是这样,那么就在那里。如果没有,那么在您的getView() 中。在您的if/else 之后
  • 如果我将该代码放在 onchecedchangelistener() 中,它会在按钮检查事件期间强制关闭。否则,如果我将代码放在 if/else 语句之后,那么它会在绘制列表本身时给我一个关闭的力。无论哪种方式,这都没有成功:(..如果你愿意,我可以发布完整的代码..你呢?
  • 您必须像初始化 TextView 一样初始化按钮。我以为你知道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 2023-04-01
  • 2023-03-26
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多