ListView中的切换按钮在滚动时更改状态

时间:2017-05-22 10:38:06

标签: android listview expandablelistview togglebutton custom-adapter

我想我已经搜索了与我的问题相关的所有帖子,但找不到我的问题的解决方案。我有一个带有两个textview和一个Toggle按钮的ListView。切换按钮向上或向下滚动(离开视图)时更改其状态。我正在使用viewholder(在论坛上建议)确实使按钮保持其状态,但随后回收属性发挥作用并弄乱我的应用程序,即多个切换按钮一次单击改变其状态。 我想要的是? 我希望我的切换按钮在其退出视图时保持其先前的状态,并且当我单击一个切换按钮时,返回加上切换按钮应该工作。 这是我的Listview代码(原谅我没有多多评论)

    public class ActivityB extends AppCompatActivity {
    ListView list;
    Button edit;
    public String text= "";
    public SharedPreferences.Editor editor;
    public SharedPreferences sharedPreferences;

    private ArrayList<String> data = new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        list = (ListView) findViewById(R.id.listView);
       generateListContent();
        list.setAdapter(new MyListadapter(this,R.layout.constraint,data));
        edit= (Button) findViewById(R.id.button);
        sharedPreferences=getSharedPreferences("MyData",Context.MODE_PRIVATE);
        editor=sharedPreferences.edit();
        text=sharedPreferences.getString("Text","Null");
        //Toast.makeText(this,text,Toast.LENGTH_LONG).show();


    }

   public void generateListContent() {
        for (int i = 0; i < 11; i++) {
            data.add("This is item no " + i);
        }

    }

    private class MyListadapter extends ArrayAdapter<String> {
        private int layout;

        ArrayList<String> list;
        public MyListadapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<String> objects) {
            super(context, resource, objects);
            layout=resource;
            list= (ArrayList<String>) objects;
        }

        @NonNull
        @Override
        public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
          ViewHolder mainviewHolder=null;
            if(convertView==null){
                LayoutInflater inflater=LayoutInflater.from(getContext());
                convertView= inflater.inflate(layout,parent,false);
                final ViewHolder viewHolder = new ViewHolder();
                viewHolder.title= (TextView) convertView.findViewById(R.id.textView);
            viewHolder.lastone= (TextView) convertView.findViewById(R.id.textView2);
            viewHolder.button= (ToggleButton) convertView.findViewById(R.id.toggleButton);

            //mainviewHolder.title.setText(getItem(position));
                viewHolder.button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                            if (isChecked) {
                                buttonView.setChecked(true);
                                Toast.makeText(getContext(), "Button is On" + position , Toast.LENGTH_LONG).show();
                            } else {
                                buttonView.setChecked(false);
                                Toast.makeText(getContext(), "Button is OFF" + position + buttonView.getId(),Toast.LENGTH_LONG).show();
                            }

                    }
                });

                convertView.setTag(viewHolder);
            }
           else{
               mainviewHolder = (ViewHolder) convertView.getTag();
              mainviewHolder.title.setText(getItem(position));
          }
            return convertView;
        }
    }
    public class ViewHolder{
        TextView title;
        TextView lastone;
        ToggleButton button;
    }

}

3 个答案:

答案 0 :(得分:0)

检查一下......

Recyclerview Changing Items During Scroll

如果以上不起作用......

方法1

你可以尝试的事情......

1.检查切换方法外的按钮状态....这样每次加载listviewe时都可以分配一个值而不是值。

  1. 创建方法togglebtn(viewHolder)//传递此perticualr项的实例

  2. 在togglebtn内....通过引用修改切换btn。

  3. togglebtn(viewHolder v) { }

    方法2

    创建一个公共数据结构来保存按钮的状态.... preferebaly hasmap存储项目no + check status ....然后每次都检查这个值并更新。

    随意问。

答案 1 :(得分:0)

不是创建字符串数组列表,而是创建类似下面的自定义对象。

Class A {
   public String title;
   public boolean isChecked;
}

根据切换按钮状态将正确值设置为isChecked(true / false)。

在getview()

中再添加一行
button.setChecked(list.get(position).isChecked)

答案 2 :(得分:0)

感谢大家节省时间和回答我的问题。     通过这些答案和论坛的一些帮助&#39;其他帖子,我找到了解决方案。     由于我的视图数量有限,因此我删除了布局inflater上的if / else条件。这解决了position变量的重用问题。现在每个视图对象都有一个唯一的position。其次,通过将切换按钮状态保存在单独的数组中并将其保持在我的getview()方法之外来解决随机按钮状态行为。