3

現在、私は RecyclerView と GridLayoutManager をさらに調査し、ギャラリー表示用の見栄えの良い UI を実現しようとしていますが、GridLayoutManager のスパン サイズに問題があります。ドキュメントが言ったように: デフォルトでは、各アイテムは 1 スパンを占有します。setSpanSizeLookup(SpanSizeLookup) を介してカスタム GridLayoutManager.SpanSizeLookup インスタンスを提供することで、これを変更できます。

これで、位置0のアイテムのスパンを2に設定すると、colspanとrowspanも2に設定されると予想されますが、そのようには機能しないようです。縦向きの場合は GridLayoutManager の列数を 2 に、横向きの場合は 4 に列数を設定しました。2番目と3番目のアイテムの下に2つの空のセルが作成されるため、縦向きでは完全に機能しますが、横向きでは機能しません。

これが私のコードです:

gallery = new ArrayList<HashMap<String, String>>();
        adapter = new GalleryAdapter(getBaseContext(), gallery);

        // using grid layout manager
        GridLayoutManager mLayoutManager = new GridLayoutManager(this, getResources().getInteger(R.integer.col_count));

        mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                switch(adapter.getItemViewType(position)){
                    case 2:
                        return 2;
                    case 1:
                        return 1;
                    default:
                        return -1;
                }
            }
        });

        list_news.setLayoutManager(mLayoutManager);
        list_news.setAdapter(adapter);

アダプター:

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

    Context context;
    ArrayList<HashMap<String, String>> article;
    ImageLoader mImageLoader;

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

    public GalleryAdapter(Context context, ArrayList<HashMap<String, String>> article){
        this.context = context;
        this.article = article;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public GalleryAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.articles_item, parent, false);
        // set the view's size, margins, paddings and layout parameters
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public int getItemViewType(int position) {
        // Just as an example, return 0 or 2 depending on position
        // Note that unlike in ListView adapters, types don't have to be contiguous
        if(position==0){
            return 2;
        }else{
            return 1;
        }
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        mImageLoader = VolleyQueue.getInstance(context).getImageLoader();
        holder.image.setImageUrl(article.get(position).get("image"), mImageLoader);
        holder.image.setDefaultImageResId(R.drawable.test);
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        @Bind(R.id.image) NetworkImageView image;

        public ViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
    }



}
}

そして、横向きと縦向きの結果のスクリーンショットは次のとおりです。

風景

肖像画

このために空白のセルを避ける方法はありますか?

アップデート:

私が達成しようとしていることをよりよく視覚化するために、横向きモードにしたいイメージを次に示します。数値は予想順位に基づく項目です。

期待される結果

4

1 に答える 1

2

SpanSizeLookupコードを次のように変更します

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        return adapter.getItemViewType(position);
    }
});

そして、アダプターのgetItemViewTypeコードを

@Override
public int getItemViewType(int position) {
    if (position == 0) {
        return context.getResources().getInteger(R.integer.col_count);
    } else {
        return 1;
    }
}
于 2015-09-03T04:22:30.837 に答える