In Ihrer Frage untersucht, habe ich gelernt, etwas Neues: ich GridLayoutManager
für RecyclerView
aussehen passiert und ich bemerkte, dass Sie eine benutzerdefinierte SpanSizeLookup
einstellen. Jetzt ist ein "span" nur eine Spalte, wenn Sie vertikal scrollen, und eine Zeile, wenn Sie horizontal scrollen. So ist die SpanSizeLookup
können Sie beispielsweise festlegen, Punkt 0 dauert 2 Spalten, Punkt 1 nimmt 1 Spalte usw.
Es stellt sich heraus, dass, wenn Sie RecyclerView
mit einer GridLayoutManager
verwenden die Lösung ist einfach peasy:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create a grid layout with two columns
GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
// Create a custom SpanSizeLookup where the first item spans both columns
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return position == 0 ? 2 : 1;
}
});
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(new MyGridAdapter());
}
Ich habe ein Testprojekt erstellt, nur um es auszuprobieren und sicherzustellen, dass es getan hat, was ich erwartet habe, und es hat wie ein Zauber funktioniert.
Eine Anmerkung über den Adapter: RecyclerView.Adapter
ist nicht mit ListAdapter
kompatibel. Sie müssen Ihren Adapter von RecyclerView.Adapter
erweitern und die entsprechenden Änderungen vornehmen. Hier
ist der Adapter, die für ein Testprojekt erstellt:
public static class MyViewHolder extends RecyclerView.ViewHolder {
ImageView mImageView;
TextView mTextView;
public MyViewHolder(View itemView) {
super(itemView);
mImageView = (ImageView) itemView.findViewById(R.id.imageView);
mTextView = (TextView) itemView.findViewById(R.id.textView);
}
}
public static class MyGridAdapter extends RecyclerView.Adapter<MyViewHolder> {
private int[] mDrawables;
public MyGridAdapter() {
this.mDrawables = new int[] {
R.drawable.images_01,
R.drawable.images_02,
.
.
.
};
}
@Override
public int getItemCount() {
return mDrawables.length;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.layout_grid_item, parent, false);
MyViewHolder holder = new MyViewHolder(view);
// set up any onClickListener you need on the view here
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.mImageView.setImageResource(mDrawables[position]);
holder.mTextView.setText("Image " + position);
}
}
Erstellen Sie zunächst eine RecyclerView.ViewHolder
Unterklasse. Das Ansichtshalter-Muster ist jetzt ein integraler Bestandteil dieser neuen Art, Adapteransichten zu erstellen. Ihr ViewHolder
richtet alle untergeordneten Ansichten für Ihre Ansicht ein. Geben Sie in Ihrer RecyclerView.Adapter
Unterklasse onCreateViewHolder()
und onBindViewHolder()
ein. In onCreateViewHolder()
bläst du deine Sicht auf und konstruierst die ViewHolder
. In onBindViewHolder()
verwenden Sie position
, um die Adapterdaten zu erhalten, und richten Sie die untergeordneten Ansichten mit der ViewHolder
ein. So RecyclerView
technisch recycelt ViewHolder
s, die View
s enthalten.
Sobald Sie diese Änderungen an Ihrem Adapter vornehmen, sollten Sie alle eingestellt sein.
Was haben Sie versucht? – mdelolmo
Ich habe eine Antwort hinzugefügt. Ich möchte vorschlagen, dass Sie den Titel und den Inhalt Ihrer Frage ändern, nur damit andere Personen, die nach dieser Lösung suchen, diese finden können. Vielleicht etwas wie: "GridView mit zwei Spalten, erstes Element erstreckt sich über beide Spalten". –