0

시나리오 : 각 자식보기에 전환 단추가있는 확장 가능한 목록보기가 있습니다. 스위치 상태가 변경되면 배경 작업은 스레드를 사용하여 백그라운드에서 수행됩니다.확장 가능한 목록보기에 스위치 단추 상태 저장

현재 구현 : 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 객체입니다.

더 자세한 정보가 필요하면 알려주세요.

도움이 되었기를 바랍니다.

+0

일부 코드를 보는 것이 유용 할 것입니다. –

+0

안녕하세요. Kristy 님, 문제를 더 잘 이해하는 데 도움이되는 코드를 추가했습니다. 도움을 주셔서 감사합니다. – user2145673

답변

0

모두에게 내가해야 할 일은 배경 작업의 응답이 완료된 후 데이터 세트를 업데이트 한 다음 notifydatasetchanged를 호출하는 것입니다. 도움이 되길 바랍니다.

관련 문제