#android #android_studio #listview #recyclerview #view
При программном добавлении сразу двух View в макет возникает ошибка такого рода: Process: com.money.evgeny.ShoppingBudget, PID: 14676 java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. at android.view.ViewGroup.addViewInner(ViewGroup.java:4310) at android.view.ViewGroup.addView(ViewGroup.java:4146) at android.view.ViewGroup.addView(ViewGroup.java:4087) at android.view.ViewGroup.addView(ViewGroup.java:4060) at com.money.evgeny.ShoppingBudget.Adapters.RVAdapter_WhatNew.onBindViewHolder(RVAdapter_WhatNew.java:60) at com.money.evgeny.ShoppingBudget.Adapters.RVAdapter_WhatNew.onBindViewHolder(RVAdapter_WhatNew.java:16) Код ACtivity с RecyclerView (куда добавляю view):Код адаптера: public class RVAdapter_WhatNew extends RecyclerView.Adapter { private List mas_data; LinearLayout card_liner; LinearLayout item_text; //Класс view holder-а, с помощью которого мы получаем ссылку на каждый элемент пункта списка class ViewHolder extends RecyclerView.ViewHolder { TextView tv_item_version; TextView tv_item_date; TextView tv_item_text; ViewHolder(View itemView) { super(itemView); tv_item_version = (TextView) itemView.findViewById(R.id.tv_item_version); tv_item_date = (TextView) itemView.findViewById(R.id.tv_item_date); tv_item_text = (TextView) itemView.findViewById(R.id.tv_item_text); } } //Конструктор для данных public RVAdapter_WhatNew(List list){ this.mas_data = list; } @Override //Создает view (вызывается LayoutManager-ом) public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_what_new_activity, parent, false); card_liner = (LinearLayout) v.findViewById(R.id.card_liner); item_text = (LinearLayout) View.inflate(v.getContext(), R.layout.sub_item_what_new_activity, null); card_liner.addView(item_text); card_liner.addView(item_text); return new ViewHolder(v); } @Override //Заменяет контент view (вызывается LayoutManager-ом) public void onBindViewHolder(ViewHolder holder, int position) { holder.tv_item_version.setText(mas_data.get(position).version); holder.tv_item_date.setText(mas_data.get(position).date); holder.tv_item_text.setText(mas_data.get(position).text[0]); } @Override //Возвращает размер данных (вызывается LayoutManager-ом) public int getItemCount() { return mas_data.size(); } } Метод в котором происходит программное добавление view и ошибка: @Override //Создает view (вызывается LayoutManager-ом) public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_what_new_activity, parent, false); card_liner = (LinearLayout) v.findViewById(R.id.card_liner); item_text = (LinearLayout) View.inflate(v.getContext(), R.layout.sub_item_what_new_activity, null); card_liner.addView(item_text); card_liner.addView(item_text); return new ViewHolder(v); }
Ответы
Ответ 1
Необходимо 2 раза вызвать inflate, т.к. в вашем случае вы пытаетесь добавить один и тот же view @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_what_new_activity, parent, false); card_liner = (LinearLayout) v.findViewById(R.id.card_liner); item_text = (LinearLayout) View.inflate(v.getContext(), R.layout.sub_item_what_new_activity, null); item_text2 = (LinearLayout) View.inflate(v.getContext(), R.layout.sub_item_what_new_activity, null); card_liner.addView(item_text); card_liner.addView(item_text2); return new ViewHolder(v); }Ответ 2
Если R.layout.sub_item_what_new_activity - это просто TextView, то можно просто два раза создать его программно. Это будет гораздо быстрее, чем инфлейтить лэйаут (особенно, два раза).
Комментариев нет:
Отправить комментарий