Взгляды теряются при прокрутке recylerview

Я заполняю динамический список в моем представлении переработчика, которое выглядит следующим образом, теперь, если вы заметили, что есть значок "+", который при щелчке создает представление, которое изначально скрыто, и выглядит так, как будто я сталкиваюсь с проблемой, когда я открываю больше чем 2-3 элемента и прокрутки, неожиданно другие элементы закрываются и данные внутри них также стираются, я пытался сохранить флаг "isExpanded", чтобы сохранить расширенную проверку элементов, но, похоже, не работает с первым и последним элементы (т.е. если я открою 1-й элемент и прокрутите вниз до последнего элемента и откройте его, 1-й будет закрыт, и наоборот)

я открыт для совершенно другого решения моего подхода или даже подходящих решений.

вот мой класс Adpater

public class Step9LaborAdapter extends RecyclerView.Adapter<Step9LaborAdapter.ChildViewHolder> implements View.OnFocusChangeListener {

List<Step9_DB.Labor> laborList;
public EditText chkFOcus;

public Step9LaborAdapter(List<Step9_DB.Labor> mlaborList) {
    this.laborList = mlaborList;
}

public List<Step9_DB.Labor> getAllItems() {
    return laborList;
}

@Override
public ChildViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_step10labor, parent, false);
    ChildViewHolder vh = new ChildViewHolder(view);
    return vh;
}

@Override
public void onBindViewHolder(ChildViewHolder holder, int position) {
    final Step9_DB.Labor laborItem = getItem(position);
    holder.tv_laborTitle.setText(laborItem.getLaborName());
    holder.s.setText(laborItem.getS());
    holder.m.setText(laborItem.getM());
    holder.m_plus.setText(laborItem.getM_plus());
    holder.l.setText(laborItem.getL());
    holder.s.setOnFocusChangeListener(this);
    holder.s.setTag(position);
    holder.m.setOnFocusChangeListener(this);
    holder.m.setTag(position);
    holder.m_plus.setOnFocusChangeListener(this);
    holder.m_plus.setTag(position);
    holder.l.setOnFocusChangeListener(this);
    holder.l.setTag(position);
    holder.tv_show_option.setTag(R.string.laboritem, holder);
    holder.tv_show_option.setTag(laborItem);
    holder.tv_show_option.setTag(R.string.labor_pos, position);
    holder.tv_show_option.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ChildViewHolder childViewHolder = (ChildViewHolder) view.getTag(R.string.laboritem);

            int pos = (int) view.getTag(R.string.labor_pos);
            Step9_DB.Labor labor = (Step9_DB.Labor) view.getTag();
            if (labor.isExpanded()) {
                childViewHolder.ll_options.setVisibility(View.GONE);
                getItem(pos).setIsExpanded(false);
            } else {
                childViewHolder.ll_options.setVisibility(View.VISIBLE);
                getItem(pos).setIsExpanded(true);
            }
           notifyDataSetChanged();

        }
    });


}

private Step9_DB.Labor getItem(int position) {
    return laborList.get(position);
}

@Override
public int getItemCount() {
    if (laborList != null)
        return laborList.size();
    else return 0;
}


public void setChkFOcus(EditText chkFOcus) {
    this.chkFOcus = chkFOcus;
}

public EditText getChkFOcus() {
    return chkFOcus;
}

public class ChildViewHolder extends RecyclerView.ViewHolder {
    public TextView tv_laborTitle, tv_show_option;
    public EditText s, m_plus, m, l;
    LinearLayout ll_options;


    public ChildViewHolder(View itemView) {
        super(itemView);
        tv_laborTitle = (TextView) itemView.findViewById(R.id.tv_labor_type);
        tv_show_option = (TextView) itemView.findViewById(R.id.tv_show_option);
        ll_options = (LinearLayout) itemView.findViewById(R.id.ll_working_days);
        s = (EditText) itemView.findViewById(R.id.et_s);
        m = (EditText) itemView.findViewById(R.id.et_m);
        m_plus = (EditText) itemView.findViewById(R.id.et_m_plus);
        l = (EditText) itemView.findViewById(R.id.et_l);

    }
}

}

пожалуйста, спросите меня, если другой код класса также требуется, потому что я думаю, что класс адаптера достаточно.

2 ответа

Решение

Спасибо за ваш ответ, но я решил это, исправив свою ошибку за то, что не проверял isExpanded условия на bindViewHolder на первом месте.

public class Step9LaborAdapter extends RecyclerView.Adapter<Step9LaborAdapter.ChildViewHolder> implements View.OnFocusChangeListener {

List<Step9_DB.Labor> laborList;
public EditText chkFOcus;

public Step9LaborAdapter(List<Step9_DB.Labor> mlaborList) {
this.laborList = mlaborList;
}

public List<Step9_DB.Labor> getAllItems() {
return laborList;
}

@Override
public ChildViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view =       LayoutInflater.from(parent.getContext()).inflate(R.layout.row_step10labor, parent, false);
ChildViewHolder vh = new ChildViewHolder(view);
return vh;
}

@Override
public void onBindViewHolder(ChildViewHolder holder, int position) {
final Step9_DB.Labor laborItem = getItem(position);
holder.tv_laborTitle.setText(laborItem.getLaborName());
holder.s.setText(laborItem.getS());
holder.m.setText(laborItem.getM());
holder.m_plus.setText(laborItem.getM_plus());
holder.l.setText(laborItem.getL());
holder.s.setOnFocusChangeListener(this);
holder.s.setTag(position);
holder.m.setOnFocusChangeListener(this);
holder.m.setTag(position);
holder.m_plus.setOnFocusChangeListener(this);
holder.m_plus.setTag(position);
holder.l.setOnFocusChangeListener(this);
holder.l.setTag(position);
holder.tv_show_option.setTag(R.string.laboritem, holder);
holder.tv_show_option.setTag(laborItem);
holder.tv_show_option.setTag(R.string.labor_pos, position);
Step9_DB.Labor labor = (Step9_DB.Labor) view.getTag();
        if (labor.isExpanded()) {
            holder.ll_options.setVisibility(View.GONE);
            getItem(pos).setIsExpanded(false);
        } else {
            holder.ll_options.setVisibility(View.VISIBLE);
            getItem(pos).setIsExpanded(true);
        }
holder.tv_show_option.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        ChildViewHolder childViewHolder = (ChildViewHolder) view.getTag(R.string.laboritem);

        int pos = (int) view.getTag(R.string.labor_pos);
        Step9_DB.Labor labor = (Step9_DB.Labor) view.getTag();
        if (labor.isExpanded()) {
            childViewHolder.ll_options.setVisibility(View.GONE);
            getItem(pos).setIsExpanded(false);
        } else {
            childViewHolder.ll_options.setVisibility(View.VISIBLE);
            getItem(pos).setIsExpanded(true);
        }
       notifyDataSetChanged();

    }
});


}

private Step9_DB.Labor getItem(int position) {
return laborList.get(position);
}

@Override
public int getItemCount() {
if (laborList != null)
    return laborList.size();
else return 0;
}


public void setChkFOcus(EditText chkFOcus) {
this.chkFOcus = chkFOcus;
}

public EditText getChkFOcus() {
return chkFOcus;
}

public class ChildViewHolder extends RecyclerView.ViewHolder {
public TextView tv_laborTitle, tv_show_option;
public EditText s, m_plus, m, l;
LinearLayout ll_options;


public ChildViewHolder(View itemView) {
    super(itemView);
    tv_laborTitle = (TextView) itemView.findViewById(R.id.tv_labor_type);
    tv_show_option = (TextView) itemView.findViewById(R.id.tv_show_option);
    ll_options = (LinearLayout) itemView.findViewById(R.id.ll_working_days);
    s = (EditText) itemView.findViewById(R.id.et_s);
    m = (EditText) itemView.findViewById(R.id.et_m);
    m_plus = (EditText) itemView.findViewById(R.id.et_m_plus);
    l = (EditText) itemView.findViewById(R.id.et_l);

}
}
}`

Вы должны управлять своими состояниями внутри метода onscroll. Пожалуйста, выполняйте кодирование в соответствии с вашими потребностями внутри onscoll. Вставьте следующий код в вашу основную деятельность или фрагмент, где создается ваше мнение о переработчике

recylerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                visibleItemCount = layoutmanager.getChildCount();
                 ViewHolder holder=new ViewHolder();
                for (int m=0;m<visibleItemCount;m++){
                   holder.view= recyclerView.getChildAt(m);
         int position=recyclerView.getChildAdapterPosition(holder.view);

//============initialize your all viewitems like this to avoid null pointer //exception
holder.tv_show_option=(TextView)holder.view.findViewById(R.id.tv_show_option);
    holder.tv_show_option.setText(yourdataitemlikearraylist.get(positionitem));

 final Step9_DB.Labor laborItem = getItem(position);
    holder.tv_laborTitle.setText(laborItem.getLaborName());
    holder.s.setText(laborItem.getS());
    holder.m.setText(laborItem.getM());
    holder.m_plus.setText(laborItem.getM_plus());
    holder.l.setText(laborItem.getL());
    holder.s.setOnFocusChangeListener(this);
    holder.s.setTag(position);
    holder.m.setOnFocusChangeListener(this);
    holder.m.setTag(position);
    holder.m_plus.setOnFocusChangeListener(this);
    holder.m_plus.setTag(position);
    holder.l.setOnFocusChangeListener(this);
    holder.l.setTag(position);
    holder.tv_show_option.setTag(R.string.laboritem, holder);
    holder.tv_show_option.setTag(laborItem);
    holder.tv_show_option.setTag(R.string.labor_pos, position);
    holder.tv_show_option.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ChildViewHolder childViewHolder = (ChildViewHolder) view.getTag(R.string.laboritem);

            int pos = (int) view.getTag(R.string.labor_pos);
            Step9_DB.Labor labor = (Step9_DB.Labor) view.getTag();
            if (labor.isExpanded()) {
                childViewHolder.ll_options.setVisibility(View.GONE);
                getItem(pos).setIsExpanded(false);
            } else {
                childViewHolder.ll_options.setVisibility(View.VISIBLE);
                getItem(pos).setIsExpanded(true);
            }
           notifyDataSetChanged();

        }
    });







                }
                }
            });

//====== добавить внутренний класс просмотра

private static class ViewHolder{


View view ;
public TextView tv_laborTitle, tv_show_option;
    public EditText s, m_plus, m, l;
    LinearLayout ll_options;
}
Другие вопросы по тегам