Как добавить горизонтальный RecyclerView в элемент списка

Задача реализации - создать бесконечный прокручиваемый список, который будет прокручиваться как по горизонтали, так и по вертикали.

Для этого я пытаюсь сделать так, что я включил горизонтальный RecyclerView внутри вертикального элемента ListView. Правильно ли это? Я пробовал другие решения, но у прокрутки есть некоторые проблемы.

Проблема в том, что когда я пытаюсь реализовать RecyclerView внутри элемента списка, элементы не заполняются.

public class HorizontalAdapter extends RecyclerView.Adapter<HorizontalAdapter.ViewHolder> {

List<ImageMedia> imageMedia;
protected Constants.IMAGE_SIZE image_size = Constants.IMAGE_SIZE.Small;
private Context context;


    public HorizontalAdapter(Context context) {
        super();
        setHasStableIds(true);
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.horizontal_item, viewGroup, false));
    }

    protected ImageMedia getItem(int position) {
        return imageMedia.get(position);
    }

    @Override
    public void onBindViewHolder(HorizontalAdapter.ViewHolder viewHolder, int i) {
        viewHolder.setMedia(getItem(i));
    }

    @Override
    public int getItemCount() {
        return (imageMedia != null ? imageMedia.size() : 0);
    }

    @Override
    public void onViewRecycled(ViewHolder holder) {
        super.onViewRecycled(holder);
    }

    @Override
    public long getItemId(int position) {
        return imageMedia.get(position).getId();
    }

    //Data gets updated here
    public void setMovies(List<Movie> movie) {

            if (movie != null) {
                imageMedia = (List<ImageMedia>) (List<?>) movie;
            } else {

            }
            notifyDataSetChanged();
    }


    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        ImageCardView imageView;
        ImageMedia imageMedia;

        public ViewHolder(View itemView) {
            super(itemView);

            imageView = (ImageCardView) itemView.findViewById(R.id.imageView);
            //TODO: remove this onclick

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //Intent to go to the corresponding activity
                }
            });
        }

        public void setMedia(ImageMedia imageMedia) {
            this.imageMedia = imageMedia;

            imageView.loadImage(imageMedia, image_size);

        }
    }
}

Ответ 1

По моему мнению, проблема возникает, когда система измеряет элемент списка.

Быстрое исправление заключалось в том, чтобы горизонтальная RecyclerView была жестко закодированная высота, но поскольку это не очень хороший способ, я продолжил охоту и нашел другой способ.

Этот ответ был полезен, и я использовал размещенную там библиотеку.

Выполните следующие действия:

  • Импортируйте библиотеку, добавив ее в файл gradle:

    compile 'org.solovyev.android.views:linear-layout-manager:[email protected]'
    
  • установите LayoutManager, как показано ниже:

    mRecyclerView.setLayoutManager(new org.solovyev.android.views.llm.LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));`
    
  • убедитесь, что раздутый вид в горизонтальном RecyclerView равен RelativeLayout, потому что другой LinearLayout не поддерживает это.
  • запустите свой проект и убедитесь в волшебстве!