Java Android-ToggleButton会丢失它';滚动列表视图后的状态

Java Android-ToggleButton会丢失它';滚动列表视图后的状态,java,android,android-listview,android-arrayadapter,android-togglebutton,Java,Android,Android Listview,Android Arrayadapter,Android Togglebutton,两天以来我一直在努力解决这个问题。我看到了许多与这个问题相关的问题。但它们不适合我。 我有一个自定义的列表视图。它的每一行包括一个图像视图,两个文本视图和一个切换按钮。这些都很好。当我将ToggleButton的状态更改为true时,当我向下滚动并再次向上滚动时,ToggleButton将失去其状态。这再次转到false 这是我的ArrayAdapter private class MyAdapter extends ArrayAdapter<String> { publi

两天以来我一直在努力解决这个问题。我看到了许多与这个问题相关的问题。但它们不适合我。
我有一个自定义的
列表视图
。它的每一行包括一个
图像视图
,两个
文本视图
和一个
切换按钮
。这些都很好。当我将
ToggleButton
的状态更改为
true
时,当我向下滚动并再次向上滚动时,
ToggleButton
将失去其状态。这再次转到
false

这是我的
ArrayAdapter

private class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int resource, int textViewResourceId,
            String[] strings) {
        super(context, resource, textViewResourceId, strings);
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        LayoutInflater inflater  = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.friends_list_item_layout, parent, false);

        RoundedImageView friendThumb = (RoundedImageView) row.findViewById(R.id.friendDp);
        TextView friendName = (TextView) row.findViewById(R.id.friendName);
        TextView friendNumber = (TextView) row.findViewById(R.id.friendNumber);
        ToggleButton shareToggle = (ToggleButton) row.findViewById(R.id.shareLocatioToggle);

        friendName.setText(myItems[position]);
        friendNumber.setText("8888888888");
        //friendThumb.setImageResource(R.drawable.friend_dp_thumb);

        shareToggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                // TODO Auto-generated method stub
                if (arg1) {
                    Toast.makeText(getApplicationContext(), "Shared with "+myItems[position], Toast.LENGTH_SHORT).show();
                }
            }
        });

        shareToggle.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "Share your location", Toast.LENGTH_SHORT).show();
                return false;
            }
        });

        return row;
    }



}
私有类MyAdapter扩展了ArrayAdapter{
公共MyAdapter(上下文上下文、int资源、int textViewResourceId、,
字符串[]字符串){
super(上下文、资源、textViewResourceId、字符串);
//TODO自动生成的构造函数存根
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
LayoutFlater充气器=(LayoutFlater)getSystemService(Context.LAYOUT\u充气器\u服务);
查看行=充气机。充气(R.layout.friends\u list\u item\u layout,parent,false);
RoundedImageView friendThumb=(RoundedImageView)row.findViewById(R.id.friendDp);
TextView friendName=(TextView)row.findViewById(R.id.friendName);
TextView friendNumber=(TextView)row.findViewById(R.id.friendNumber);
ToggleButton shareToggle=(ToggleButton)row.findViewById(R.id.ShareLocationToggle);
setText(myItems[position]);
friendNumber.setText(“8888888888”);
//setImageResource(R.drawable.friend\u dp\u thumb);
setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
已更改复选框时的公共无效(复合按钮arg0,布尔值arg1){
//TODO自动生成的方法存根
如果(arg1){
Toast.makeText(getApplicationContext(),“与”+myItems[position],Toast.LENGTH\u SHORT.show()共享”;
}
}
});
setOnLongClickListener(新的OnLongClickListener(){
@凌驾
仅长按公共布尔值(视图arg0){
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“共享您的位置”,Toast.LENGTH\u SHORT.show();
返回false;
}
});
返回行;
}
}

感谢您必须使用setter-getter方法维护切换的标志,默认情况下,它是关闭的,然后您必须打开/关闭切换并调用notifydatasetchanged()来维护它的状态。

如果它在列表视图的可见性之外,则会重新创建切换状态。可以使整个活动可滚动。所以切换按钮不会丢失其状态

您需要两件事,一个数组来记住哪些项已被切换,以及显式地
setChecked()
已切换的项

private boolean[] myChecks = new boolean[myItems.length];
private class MyAdapter extends ArrayAdapter<String> {
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ...
        shareToggle.setChecked(myChecks[position]);
        shareToggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                ...
                myChecks[position] = arg1;
            }
        });
}
private boolean[]myChecks=new boolean[myItems.length];
私有类MyAdapter扩展了ArrayAdapter{
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
...
setChecked(myChecks[position]);
setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
已更改复选框时的公共无效(复合按钮arg0,布尔值arg1){
...
myChecks[位置]=arg1;
}
});
}

您必须根据当前项目显式设置
getView()上的切换状态,就像在
文本视图中设置文本一样,但如何在代码中实现这一点?我很困惑完美解决方案的可能重复。非常感谢:)检查此链接