【问题标题】:Toggle button in ListView changes State on ScrollingListView 中的切换按钮在滚动时更改状态
【发布时间】:2017-05-22 10:38:06
【问题描述】:

我想我已经搜索了与我的问题相关的所有帖子,但找不到解决问题的方法。我有一个带有两个文本视图和一个切换按钮的 ListView。切换按钮 当我向上或向下滚动时更改其状态(消失)。我正在使用查看器(在论坛上建议),它确实使按钮保持其状态,但随后回收属性开始发挥作用并弄乱我的应用程序,即多个切换按钮一键更改其状态。 我想要的是? 我希望我的切换按钮在它消失并返回时保持其先前的状态,并且当我单击一个切换按钮时,只有该切换按钮应该工作。 这是我的 Listview 代码(请原谅我没有放太多 cmets)

    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;
    }

}

【问题讨论】:

  • 是的,这是因为 View holder patten。这就像为下一个数据重用视图。你能做什么。制作一个布尔数组(主数组的大小)并保存切换按钮的状态。你可以在 OnBind 视图方法上设置它。

标签: android listview expandablelistview togglebutton custom-adapter


【解决方案1】:

检查一下...

Recyclerview Changing Items During Scroll

如果上述方法不起作用....

方法一

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

1.检查切换方法之外的按钮状态....这样每次加载列表视图时它都可以分配一个值而不是没有值。

  1. 创建一个方法 togglebtn(viewHolder) // 传递这个特定项目的实例

  2. Inside togglebtn....通过引用实例修改toggle btn。

togglebtn(viewHolder v) { }

方法二

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

欢迎提问。

【讨论】:

    【解决方案2】:

    不是创建字符串数组列表,而是创建一个自定义对象,如下所示。

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

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

    还要在 getview() 中再添加一行

    button.setChecked(list.get(position).isChecked)
    

    【讨论】:

    • 在我的代码中使用了 'button.setChecked()' 语句。它有帮助。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多