Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Добавление View программно

#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, то можно просто два раза создать его программно. Это будет гораздо быстрее, чем инфлейтить лэйаут (особенно, два раза).

Комментариев нет:

Отправить комментарий