Взгляды теряются при прокрутке 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;
}