在可扩展列表视图中保存开关按钮状态
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。
希望对您有所帮助。
场景: 我有一个可扩展的列表视图,在每个子视图中我都有切换按钮。 当开关状态发生变化时,将使用 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。 希望对您有所帮助。