시나리오 : 각 자식보기에 전환 단추가있는 확장 가능한 목록보기가 있습니다. 스위치 상태가 변경되면 배경 작업은 스레드를 사용하여 백그라운드에서 수행됩니다.확장 가능한 목록보기에 스위치 단추 상태 저장
현재 구현 : baseexpandable 어댑터를 확장하는 메인 프래그먼트 클래스와 어댑터가 있습니다.
어댑터에는 백그라운드 조작을 실행하는 프래그먼트 클래스의 메소드를 호출하는 스위치에 대한 리스너가 있습니다.
매개 변수 중 하나는 데이터 집합의 관련 개체이며 배경 작업의 결과에 따라 개체 데이터 집합이 변경됩니다. (set 메소드 사용).
문제점 : 스위치 상태가 저장되지 않습니다. 다시 그룹을 확장 한 후 이전 상태로 돌아갑니다. 2. 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이를 확장하는 클래스의 인스턴스이다 조각 클래스에서 set_S_STATE 메소드는 새 스레드를 만들고 배경 작업을 실행합니다. set_S_STATE 메소드의 장소 인 매개 변수 중 하나는 백그라운드 작업 응답에 따라 업데이트되는 자식 뷰의 dateset 객체입니다.
더 자세한 정보가 필요하면 알려주세요.
도움이 되었기를 바랍니다.
일부 코드를 보는 것이 유용 할 것입니다. –
안녕하세요. Kristy 님, 문제를 더 잘 이해하는 데 도움이되는 코드를 추가했습니다. 도움을 주셔서 감사합니다. – user2145673