«Представления ViewHolder не должны быть присоединены при создании» - RecyclerView с ArrayList - PullRequest
0 голосов
/ 25 июня 2019

Я новичок в Android и Android Studio. Я пытаюсь получить повторное представление с помощью arraylist, но получаю ошибку «Представления ViewHolder не должны быть присоединены при создании». Это первый раз, когда я пытаюсь реализовать RecyclerView. Сначала я пытаюсь вставить статические данные в макет, но позже я хочу получить данные из базы данных и динамически показать их в действии.

Основная деятельность: -

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerview;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar  = findViewById(R.id.main_actionbar);
        setSupportActionBar(toolbar);

        ArrayList<ExampleItem> exampleList = new ArrayList<>();
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product1","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product2","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product3","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product4","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product5","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product6","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product7","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product8","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product9","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product10","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product11","Description", "Bla Bla Bla", "Bla Bla Bla"));
        exampleList.add(new ExampleItem(R.drawable.ic_search_black_24dp,"Product12","Description", "Bla Bla Bla", "Bla Bla Bla"));

        mRecyclerview = findViewById(R.id.main_recyclerview);
        mRecyclerview.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(this);
        mAdapter = new ExampleAdpater(exampleList);

        mRecyclerview.setLayoutManager(mLayoutManager);
        mRecyclerview.setAdapter(mAdapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.sample_menu, menu);
        return true;
    }
}

Пример кода (класса): -

package com.example.myapplication;

public class ExampleItem {
    private int mImageResource;
    private String mText1;
    private String mText2;
    private String mText3;
    private String mText4;

    public ExampleItem(int imageResource, String text1, String text2, String text3, String text4){
        mImageResource = imageResource;
        mText1 = text1;
        mText2 = text2;
        mText3 = text3;
        mText4 = text4;

    }

    public int getImageResource(){
        return  mImageResource;
    }

    public String getText1(){
        return mText1;
    }

    public String getText2(){
        return mText2;
    }

    public String getText3(){
        return mText3;
    }

    public String getText4(){
        return mText4;
    }
}

ExampleAdapter (класс): -

package com.example.myapplication;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class ExampleAdpater extends RecyclerView.Adapter<ExampleAdpater.ExampleviewHolder> {

    private ArrayList<ExampleItem> mExampleList;

    public static class  ExampleviewHolder extends RecyclerView.ViewHolder{

        public ImageView mImageView;
        public TextView mTextView1;
        public TextView mTextView2;
        public TextView mTextView3;
        public TextView mTextView4;

        public ExampleviewHolder(@NonNull View itemView) {
            super(itemView);
            mImageView = itemView.findViewById(R.id.myImageView1);
            mTextView1 = itemView.findViewById(R.id.myTextView1);
            mTextView2 = itemView.findViewById(R.id.myTextView2);
            mTextView3 = itemView.findViewById(R.id.myTextView3);
            mTextView4 = itemView.findViewById(R.id.myTextView4);
        }
    }

    public ExampleAdpater(ArrayList<ExampleItem> exampleList){
        mExampleList = exampleList;
    }

    @NonNull
    @Override
    public ExampleviewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, parent);
        ExampleviewHolder evh = new ExampleviewHolder(v);
        return  evh;
    }

    @Override
    public void onBindViewHolder(@NonNull ExampleviewHolder holder, int position) {
        ExampleItem currentItem = mExampleList.get(position);

        holder.mImageView.setImageResource(currentItem.getImageResource());
        holder.mTextView1.setText(currentItem.getText1());
        holder.mTextView2.setText(currentItem.getText2());
        holder.mTextView3.setText(currentItem.getText3());
        holder.mTextView4.setText(currentItem.getText4());
    }

    @Override
    public int getItemCount() {
        return mExampleList.size();
    }
}

Ответы [ 5 ]

1 голос
/ 25 июня 2019

попробуйте

  return new ExempleViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pub, parent, false));

и

 this.mExampleList = exampleList;
1 голос
/ 25 июня 2019

использовать для создания -

@Override
public ExampleviewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item,parent, false);
    ExampleviewHolder evh = new ExampleviewHolder(v);
    return  evh;
}
1 голос
/ 25 июня 2019
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, parent);

Это неявно добавит раздутый элемент к parent.Вы не должны делать это с RecyclerView.

Используйте

View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, parent, false);

, чтобы не добавить его к родителю.

1 голос
/ 25 июня 2019

Попробуйте добавить логическое значение false для присоединения к корню в качестве параметра в onCreateViewHolder.т.е.

View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, parent, false);
1 голос
/ 25 июня 2019

Pass false для второго аргумента метода inflate.

View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...