2015-06-27 3 views
19

Ich habe ein Imageview & ein gridview ..Gridview mit zwei Spalten, erstreckt sich über erste Element beide Spalten

Mein Layout-Design hier ..

enter image description here

Ich möchte diese beiden Ansichten in einzelne kombinieren gridview

meine Frage:

Wie gridview erstes Element setzen reicht in beiden Spalten?

+0

Was haben Sie versucht? – mdelolmo

+1

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". –

Antwort

48

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.

+0

Ich ersetze meine Bildansicht & Gridview durch Recyclerview.nach dem Sie Ihren Code anwenden .. Ich habe Fehler in recyclerView.setAdapter (Adapter); – AndroidDev

+1

Leider ist 'RecyclerView.Adapter' nicht mit' ListAdapter' kompatibel, daher müssen Sie Ihren Adapter ein wenig neu anordnen. Ich werde meine Antwort aktualisieren, um etwas dazu hinzuzufügen. –

+0

Danke Mann..Es funktioniert erstaunlich..können Sie teilen, wie Sie die Lösung finden? weil ich mehr als 10 Tage für dieses Problem suche. Los von googling nicht Antwort liefern. – AndroidDev

Verwandte Themen