RecyclerView: раздувать еще одну строку LinearLayout в адаптере - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь надуть 2 строки LinearLayout в свой пользовательский адаптер, когда это необходимо. Чтобы избежать того, что мой надутый LinearLayout будет обрезан по краю моего ListView, я хочу ограничить количество надутых изображений для каждой строки до 5.

BLOCKLAYOUT.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">

</LinearLayout>

BlockAdapter.java

public BlockAdapter(Context context,List<Cscore> blocks, int pos) {
        this.mContext = context;
        this.blocks = blocks;
        this.currentPosition = pos;
    }

    @Override
    public int getItemCount() {
        return 1;
    }

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

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        if(blocks != null) {
            holder.bind(blocks.get(currentPosition),null);
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private final List<ImageView> imageViews = new ArrayList<>();
        private final ViewGroup container;

        public ViewHolder(View v) {
            super(v);
            container = (ViewGroup) itemView;
        }

        public void bind(Cscore block) {
            recycleImageViews();
            if(block !=null) {

                for (int i = 0; i < block.getMaxscore(); ++i) {
                    final ImageView imageView = getRecycledImageViewOrCreate();
                    Picasso.get().load(block.getImgurl()).into(imageView);
                    imageViews.add(imageView);
                    container.addView(imageView);


                }
            }

        }

        private ImageView getRecycledImageViewOrCreate() {
            if (imageViewPool.isEmpty()) {
                return (ImageView)LayoutInflater.from(container.getContext()).inflate(R.layout.imageView, container, false);
            }
            return imageViewPool.remove(0);
        }

        public void recycleImageViews() {
            imageViewPool.addAll(imageViews);
            imageViews.clear();
            container.removeAllViews();
        }
    }

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

Этот BlockAdapter только раздувает изображения и является дочерним по отношению к другому адаптеру, который отображает текст и другие материалы. Поэтому мой getItemCount () возвращает 1, потому что я хочу, чтобы только 1 RecyclerView отображался внутри родительского адаптера.

R.layout.imageView - это простой imageView:

<ImageView android:id="@+id/block"
    android:layout_width="@dimen/icon_l"
    android:layout_height="@dimen/icon_l" />

Iпопытался поработать над методом связывания:

public void bind(Cscore block) {
recycleImageViews();
if(block !=null) { ...}  
imageViews.add(imageView);
container.addView(imageView);
}

там я должен накачать другую строку / строку LinearLayout с горизонтальной ориентацией при достижении 5-го элемента в моем ImagesList ... очевидно, продолжая с 6-м элементом, а не спервый

...