0

Сценарий: У меня есть расширяемый список, в котором у каждого дочернего элемента есть кнопка переключения. При изменении состояния переключателя в фоновом режиме выполняется операция bacground с использованием Thread.сохранить состояние кнопки переключателя в расширяемом списке просмотров

Текущая реализация: У меня есть мой основной класс фрагмента и адаптер, который расширяет базовый адаптер.

В адаптере есть коммутатор, который вызывает метод в классе фрагмента, который выполняет фоновое действие.

Один из параметров, которые преобразуются, является соответствующим объектом из набора данных и в соответствии с результатом фонового задания изменен набор данных объекта. (с использованием метода набора).

Проблема: Есть две основные проблемы: 1. Состояние переключателя не сохраняется - после повторного расширения группы оно возвращается в старое состояние. 2. Когда я использую адаптер.notifydatasetchanged, пользовательский интерфейс получает стек в течение примерно 5 секунд, а пропущенные сообщения кадров отображаются в логарифме.

То, что я ищу, является хорошим примером реализации конструкции для вышеупомянутого сценария, в котором задействованы потоки.

Желаемый результат: кнопка 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 создает новый поток и выполняет задание bacground. одним из параметров, которые являются местами в методе set_S_STATE, является объект-дата дочернего представления, который обновляется в соответствии с ответом задания фона.

если требуется какая-либо дополнительная информация, пожалуйста, дайте мне знать

Я надеюсь, что помогает.

+0

Было бы полезно увидеть код. –

+0

Привет, Кристи, я добавил код, который, я надеюсь, поможет вам лучше понять проблему, спасибо за вашу помощь – user2145673

ответ

0

Для всех, что я делаю, это обновить набор данных после того, как будет выполнен ответ от фонового задания, а затем вызовите notifydatasetchanged. Надеюсь, что помогает.

Смежные вопросы