在可扩展列表视图中保存切换按钮状态

时间:2015-01-21 13:57:18

标签: android multithreading android-fragments android-listview expandablelistview

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

目前的实施: 我有我的主片段类和适配器,它扩展了baseexpandable适配器。

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

trasnffered的其中一个参数是来自数据集的相关对象,并根据后台作业的结果更改了对象数据集。 (使用set方法)。

问题: 有两个主要问题: 1.开关状态未保存 - 意味着在重新扩展组后它返回到旧状态。 2.当我使用adapter.notifydatasetchanged时,UI正在堆栈大约5秒钟,并且跳过的帧消息出现在logcat中。

我正在寻找的是一个很好的设计实现示例,适用于涉及线程的上述场景。

期望的结果: 1.勾选按钮 2.background操作完成 3.使用新值更新子视图。

先谢谢大家的帮助:-)

下面的

是可扩展代码的一部分,它只包含相关部分

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是扩展Fragment类的类的实例,方法set_S_STATE创建一个新的Thread并执行bacground作业。 set_S_STATE方法中的一个参数是根据后台作业响应更新的子视图的日期集对象。

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

我希望有所帮助。

1 个答案:

答案 0 :(得分:0)

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