在可扩展列表视图中保存开关按钮状态

save switch button state in expandable listview

场景: 我有一个可扩展的列表视图,在每个子视图中我都有切换按钮。 当开关状态发生变化时,将使用 Thread 在后台完成一个免费作业。

当前实施: 我有我的主要片段 class 和扩展 baseexpandable 适配器的适配器。

在适配器中有一个开关侦听器,它调用执行后台操作的片段 class 中的方法。

传输的参数之一是数据集中的相关对象,并且根据后台作业的结果更改对象数据集。 (使用设置方法)。

问题: 主要有两个问题: 1.the 切换状态未保存 - 意味着在重新扩展组后它 returns 到旧状态。 2.when 我使用 adapter.notifydatasetchanged UI 正在获取堆栈大约 5 秒,跳帧消息出现在 logcat.

我正在寻找的是针对上述涉及线程的场景的良好设计实现示例。

想要的结果: 1.switch 按钮已选中 2.background 操作完成 3.childview 更新为新值。

在此先感谢大家的帮助:-)

以下为部分可扩展代码,仅包含相关部分

public class EXP_LST_ADAPTER extends BaseExpandableListAdapter{

.
.
.
.
.
.

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {


        View parentView =convertView;
        ViewHolder holder=new ViewHolder();

        LayoutInflater inflater = (LayoutInflater)this.CNTX.getSystemService
                  (Context.LAYOUT_INFLATER_SERVICE);

        if(parentView==null)
        {

            parentView = inflater.inflate(R.layout.group_index_list_layout, parent, false);
            holder.g_name=(TextView)parentView.findViewById(R.id.tv_G_Name);
            holder.g_m=(TextView)parentView.findViewById(R.id.tv_G_M);
            holder.g_h=(TextView)parentView.findViewById(R.id.tv_G_H);
            parentView.setTag(holder);
        }
        else{

            holder=(ViewHolder)parentView.getTag();
        }

        holder.g_name.setText(S_G_PARENT.get(groupPosition).Get_G_Name());
        holder.g_m.setText(S_G_PARENT.get(groupPosition).Get_G_M());
        holder.g_h.setText(S_G_PARENT.get(groupPosition).Get_G_H());




        return parentView;
    }

    @Override
    public View getChildView( int groupPosition,  int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {


        childView=convertView;
        LayoutInflater inflaterchild = (LayoutInflater)this.CNTX.getSystemService
                  (Context.LAYOUT_INFLATER_SERVICE);
        final ViewHolder holder=new ViewHolder();
        final int childpos=childPosition;
        final int grppos=groupPosition;

        if(childView==null)
        {

            childView = inflaterchild.inflate(R.layout.group_exp_list_child_layout, parent, false);

        }

        TextView grp_r_indx=(TextView)childView.findViewById(R.id.tv_real_S_n_in_G);
        TextView grp_r_state=(TextView)childView.findViewById(R.id.tv_Real_S_s);
        holder.OPR_R_S=(Switch)childView.findViewById(R.id.sw_real_dis_ena);

        grp_r_indx.setText(getChild(groupPosition,childPosition).get_s_indx());
        grp_r_state.setText(getChild(groupPosition,childPosition).getR_S_STATE_STR());
        if(getChild(groupPosition,childPosition).get_s_state()==1)
        {
            holder.OPR_R_S.setChecked(true);
        }
        else {
            holder.OPR_R_S.setChecked(false);
        }

        holder.OPR_R_S.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                try
                {
                    if(holder.OPR_R_S.isChecked()) {

                        mS_G_frag.set_S_STATE(getChild(grppos, childpos), 1, S_G_EXP_L_ADAPTER.this);
                        /*
                        if(mS_G_frag.mSETresponse)

                            {
                                Log.i("result of switch","true");
                            }
                            */

                    }
                    else
                        mS_G_frag.set_S_STATE(getChild(grppos, childpos), 2, S_G_EXP_L_ADAPTER.this);
                    /*
                    if(mS_G_frag.mSETresponse)
                         {
                                Log.i("result of switch else","true");
                         }
                         */
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                }


        });







        return childView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }



public final class  ViewHolder
{
   TextView g_name;
   TextView g_met;
   TextView g_he;
   Switch   OP_R_S;
}


}

mS_G_frag 是 class 的实例,它扩展了 Fragment class,方法 set_S_STATE 创建了一个新线程并执行了一个后台作业。 set_S_STATE 方法中的参数之一是根据后台作业响应更新的子视图的日期集对象。

如果需要任何进一步的信息,请告诉我

希望对您有所帮助。

对于每个人,我最终做的是在后台作业完成响应后更新数据集,然后调用 notifydatasetchanged。 希望对您有所帮助。