2015-06-27 24 views
19

mam jeden celowniki kolimatorowe & jeden GridView ..GridView z dwoma kolumnami, pierwsza pozycja obejmuje obie kolumny

Moja layoutu tutaj ..

enter image description here

chcę połączyć te dwa poglądy na pojedyncze GridView

moje pytanie:

Jak ustawić gridview pierwszy element rozciąga się w obu kolumnach?

+0

Czego próbowałeś? – mdelolmo

+1

Dodałem odpowiedź. Chciałbym zasugerować, abyś zmienił tytuł i treść swojego pytania, tak aby inni ludzie, którzy szukają tego rozwiązania, mogli go znaleźć. Być może coś w stylu: "GridView z dwiema kolumnami, pierwsza pozycja obejmuje obie kolumny". –

Odpowiedz

48

Podczas badania twojego pytania, nauczyłem się czegoś nowego: zdarzyło mi się, że patrzę na GridLayoutManager dla RecyclerView i zauważyłem, że możesz ustawić niestandardowy SpanSizeLookup. Teraz "rozpiętość" to tylko kolumna, jeśli przewijasz pionowo i wiersz, jeśli przewijasz poziomo. Więc SpanSizeLookup pozwala określić, na przykład, pozycja 0 trwa 2 kolumny, pozycja 1 trwa 1 kolumnę itd

Okazuje się, że jeśli używasz RecyclerView z GridLayoutManager rozwiązanie jest łatwe 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()); 
    } 

Stworzyłem testowy projekt, aby go wypróbować i upewnić się, że zrobił to, czego oczekiwałem, i zadziałało jak czar.


Uwaga na temat adaptera: RecyclerView.Adapter nie jest kompatybilny z ListAdapter. Należy rozszerzyć adapter z RecyclerView.Adapter i wprowadzić odpowiednie zmiany.

Oto adapter stworzyłem dla mojego projektu badawczego:

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); 
     } 
    } 

Najpierw utwórz RecyclerView.ViewHolder podklasy. Wzorzec widoku jest teraz integralną częścią tego nowego sposobu wyświetlania widoków adapterów. Twój ViewHolder skonfiguruje wszystkie widoki podrzędne dla twojego widoku.

Następnie w podklasie RecyclerView.Adapter przesuń onCreateViewHolder() i onBindViewHolder(). W onCreateViewHolder() nadmuchujesz swój widok i konstruujesz ViewHolder. W wersji onBindViewHolder() używa się position do pobierania danych adaptera i konfigurowania widoków podrzędnych za pomocą ViewHolder. Tak więc technicznie poddaje się recyklingowi, które zawierają s.

Po wprowadzeniu zmian w adapterze powinieneś wszystko ustawić.

+0

Zamieniam mój widok obrazu i widok siatki z widokiem recyclerview.after zastosuj swój kod. Dostaję błąd w pliku recyclerView.setAdapter (adapter); – AndroidDev

+1

Niestety, 'RecyclerView.Adapter' nie jest kompatybilny z' ListAdapter', więc będziesz musiał zmienić nieco swój adapter. Zaktualizuję moją odpowiedź, aby dodać coś o tym. –

+0

Dzięki człowieku .. Działa zadziwiająco ... możesz podzielić się tym, jak znaleźć rozwiązanie? ponieważ szukam więcej niż 10 dni na ten problem. Lot googlowania nie zapewnia odpowiedzi .. – AndroidDev