Сценарий: У меня есть расширяемый список, в котором у каждого дочернего элемента есть кнопка переключения. При изменении состояния переключателя в фоновом режиме выполняется операция 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, является объект-дата дочернего представления, который обновляется в соответствии с ответом задания фона.
если требуется какая-либо дополнительная информация, пожалуйста, дайте мне знать
Я надеюсь, что помогает.
Было бы полезно увидеть код. –
Привет, Кристи, я добавил код, который, я надеюсь, поможет вам лучше понять проблему, спасибо за вашу помощь – user2145673