8

正確には、これを達成したいです。 ここに画像の説明を入力

GridLayoutManager で recyclerview を使用しています。また、次のコードを使用して最初のアイテムを大きくしました

        lLayout.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int i) {
            if (i==0) return 2;
            else return 1;
        }
    });

1 つを除いてすべて正常に機能します。位置 1 のアイテム (つまり、大きな画像の次のアイテム) は、大きなアイテムの高さに合わせて垂直方向に引き伸ばされます。行 3 から、すべての画像は画像に示すとおりです。

どうすればこれを取り除くことができますか?

編集:いくつかの分析の後

したがって、問題は、大きな画像が水平方向に 2 つのスパンを取り、垂直方向に単一のスパンを取っていることです。このため、2 番目の画像は引き伸ばされたように見えます。

だから今私の質問は、グリッドアイテムを垂直に2つのスパンと水平に2つのスパンにする方法ですか?

4

2 に答える 2

6

GridLayoutManagerの代わりにStaggeredGridLayoutManagerを使用してみてください。StaggeredGridLayoutManagerは、水平および垂直レイアウトと、子を逆にレイアウトする機能をサポートします。 このコードを使用してアイテムの位置に応じてスパンを設定できるアダプタのonBindViewHolderメソッド

final ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();    
if (position == 0) {
                StaggeredGridLayoutManager.LayoutParams sglp = (StaggeredGridLayoutManager.LayoutParams) lp;
                sglp.setFullSpan(true);
                holder.itemView.setLayoutParams(sglp);
            }

例を見つけてください http://enoent.fr/blog/2015/01/18/recyclerview-basics/ ...それがあなたに役立つことを願っています

于 2015-08-03T10:58:07.233 に答える
0

GridViewAdapter クラスで次のコードを試してください

public class GridViewAdapter extends BaseAdapter {
private Context context;
private ArrayList<Integer> imageArrayList = new ArrayList<>();
private int type;

public GridViewAdapter(Context context, ArrayList<Integer> imageArrayList) {
    this.context = context;
    this.imageArrayList = imageArrayList;
}

@Override
public int getCount() {
    return imageArrayList.size();
}

@Override
public Object getItem(int position) {
    return imageArrayList.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = new ViewHolder();
    if(convertView==null){
        LayoutInflater inflater = LayoutInflater.from(context);
        type = getItemViewType(position);
        if(type==0) {
            convertView = inflater.inflate(R.layout.big_layout,parent,false);
        }else {
            convertView = inflater.inflate(R.layout.small_layout, parent, false);
        }
        viewHolder.imageView = convertView.findViewById(R.id.imageView);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder) convertView.getTag();
    }
        viewHolder.imageView.setImageDrawable(context.getResources().getDrawable(imageArrayList.get(position)));
    return convertView;
}

@Override
public int getViewTypeCount() {
    return super.getViewTypeCount();
}

@Override
public int getItemViewType(int position) {
    if(position==0) {
        return 0;
    }else{
        return 1;
    }
}

    private class ViewHolder{
        ImageView imageView;
    }
}
于 2015-08-03T12:15:19.317 に答える