方案: 我有一个可扩展的列表视图,在每个子视图中我都有切换按钮。 当开关状态发生变化时,使用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方法中的一个参数是根据后台作业响应更新的子视图的日期集对象。
如果需要任何进一步的信息,请告诉我
我希望有所帮助。
答案 0 :(得分:0)
对于每个人来说,我最终做的是在完成后台作业的响应后更新数据集,然后调用notifydatasetchanged。 希望有所帮助。