我想我已经搜索了与我的问题相关的所有帖子,但找不到我的问题的解决方案。我有一个带有两个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;
}
}
答案 0 :(得分:0)
检查一下......
Recyclerview Changing Items During Scroll
如果以上不起作用......
方法1
你可以尝试的事情......
1.检查切换方法外的按钮状态....这样每次加载listviewe时都可以分配一个值而不是值。
创建方法togglebtn(viewHolder)//传递此perticualr项的实例
在togglebtn内....通过引用修改切换btn。
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()
方法之外来解决随机按钮状态行为。