GridLayoutManager ile RecyclerView kullanan basit Android ızgara örneği (eski GridView gibi)


227

Ben RecyclerVieweski ListViewve işlevselliğini değiştirdi biliyorum GridView. Kullanarak minimal bir ızgara kurulumu gösteren çok temel bir örnek arıyorum RecyclerView. Uzun öğretici stil açıklamaları aramıyorum, sadece minimal bir örnek. Eski GridView'i taklit eden en basit kılavuzun aşağıdaki özelliklerden oluştuğunu hayal ediyorum:

  • satır başına birden çok hücre
  • her hücrede tek görünüm
  • tıklama etkinliklerine yanıt verir

Yanıtlar:


556

Kısa cevap

Bir liste yapmak için a ayarlamayaRecyclerView zaten aşina olanlar için , iyi haber şu ki bir ızgara yapmak büyük ölçüde aynıdır. Kurulumu yaparken yalnızca bir GridLayoutManageryerine kullanın .LinearLayoutManagerRecyclerView

recyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns));

Bundan daha fazla yardıma ihtiyacınız olursa, aşağıdaki örneği inceleyin.

Tam örnek

Aşağıdaki resim aşağıdaki görüntüye benzeyecek minimal bir örnektir.

resim açıklamasını buraya girin

Boş bir etkinlikle başlayın. RecyclerViewIzgara eklemek için aşağıdaki görevleri gerçekleştireceksiniz . Tek yapmanız gereken kodu her bölüme kopyalayıp yapıştırmaktır. Daha sonra ihtiyaçlarınıza göre özelleştirebilirsiniz.

  • Dereceye bağımlılıklar ekleme
  • Etkinlik ve ızgara hücresi için xml mizanpaj dosyalarını ekleme
  • RecyclerView adaptörünü yapma
  • Etkinliğinizde RecyclerView'i başlatın

Gradle bağımlılıklarını güncelleme

Uygulama gradle.builddosyanızda aşağıdaki bağımlılıkların bulunduğundan emin olun :

compile 'com.android.support:appcompat-v7:27.1.1'
compile 'com.android.support:recyclerview-v7:27.1.1'

Sürüm numaralarını en güncel sürümle güncelleyebilirsiniz .

Etkinlik düzeni oluştur

RecyclerViewXml düzeninize ekleyin .

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvNumbers"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

Izgara hücresi düzeni oluşturma

Şebekemizdeki her hücrenin RecyclerViewsadece bir tane olacak TextView. Yeni bir düzen kaynak dosyası oluşturun.

recyclerview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:padding="5dp"
    android:layout_width="50dp"
    android:layout_height="50dp">

        <TextView
            android:id="@+id/info_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:background="@color/colorAccent"/>

</LinearLayout>

Bağdaştırıcıyı oluşturun

RecyclerViewVerilerinizi her hücrede görüşlerini doldurmak için bir adaptör ihtiyacı var. Yeni bir java dosyası oluşturun.

MyRecyclerViewAdapter.java

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

    private String[] mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;

    // data is passed into the constructor
    MyRecyclerViewAdapter(Context context, String[] data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }

    // inflates the cell layout from xml when needed
    @Override
    @NonNull 
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recyclerview_item, parent, false);
        return new ViewHolder(view);
    }

    // binds the data to the TextView in each cell
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.myTextView.setText(mData[position]);
    }

    // total number of cells
    @Override
    public int getItemCount() {
        return mData.length;
    }


    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView myTextView;

        ViewHolder(View itemView) {
            super(itemView);
            myTextView = itemView.findViewById(R.id.info_text);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    // convenience method for getting data at click position
    String getItem(int id) {
        return mData[id];
    }

    // allows clicks events to be caught
    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

notlar

  • Kesinlikle gerekli olmamasına rağmen, hücrelerdeki tıklama etkinliklerini dinleme işlevini dahil ettim. Bu eski GridViewve mevcuttu ortak bir ihtiyaç. İhtiyacınız yoksa bu kodu kaldırabilirsiniz.

Aktivitede RecyclerView'i başlat

Ana etkinliğinize aşağıdaki kodu ekleyin.

MainActivity.java

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {

    MyRecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // data to populate the RecyclerView with
        String[] data = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"};

        // set up the RecyclerView
        RecyclerView recyclerView = findViewById(R.id.rvNumbers);
        int numberOfColumns = 6;
        recyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
        adapter = new MyRecyclerViewAdapter(this, data);
        adapter.setClickListener(this);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onItemClick(View view, int position) {
        Log.i("TAG", "You clicked number " + adapter.getItem(position) + ", which is at cell position " + position);
    }
}

notlar

  • Etkinliğin ItemClickListener, adaptörümüzde tanımladığımız işlemi gerçekleştirdiğine dikkat edin. Bu, içindeki hücre tıklama olaylarını işlememize olanak tanır onItemClick.

bitmiş

Bu kadar. Projenizi şimdi çalıştırabilmeli ve üstteki görüntüye benzer bir şey elde edebilmelisiniz.

Devam ediyor

Yuvarlatılmış köşeler

Sütunları otomatik sığdırma

İlerideki çalışma


2
@ MarianPaździoch, Evet, bunu minimal bir örnek olarak yaptım. Kesinlikle bazı güzelleştirme işlerini kullanabilir. Gelecekte bu yanıtı güncellemeye çalışacağım.
Ağustos'ta Suragch

1
Sadece senin gibi insanların bu portalı canlı tuttuğunu ve bu çözümü görmeden önce iki gün boyunca bu konuda sıkışıp kaldığımı göstermek için giriş yaptım. çok teşekkürler
VarunJoshi129

1
@androiddeveloper, Izgara öğeleri soldan sağa, yukarıdan aşağıya doğru yerleştirilir. Ekrana sığmayacak kadar çok öğe olduğunda kaydırma dikeydir.
Suresi

13
Gelecek okuyucular, size biraz zaman kazandırmama izin verin, önemli olanrecyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
daka

1
@daka, iyi bir nokta. Cevabımı, bunu başlangıçta içerecek şekilde düzenledim.
Suragch

7

Suragch'ın cevabını beğenip takdir etsem de , bir not bırakmak istiyorum, çünkü Listener yöntemini tanımlamak ve ifşa etmek için Adapter ( MyRecyclerViewAdapter) kodlamasının, onItemClicksınıf kapsülleme kullanmadığı için bunu yapmanın en iyi yolu olmadığını buldum doğru şekilde. Bu yüzden önerim, Bağdaştırıcının Dinleme işlemlerini yalnızca işleyişine izin vermektir (amacı budur!) Ve bunları Bağdaştırıcı ( MainActivity) kullanan Etkinlikten ayırmaktır . Bağdaştırıcı sınıfını şöyle ayarlıyorum:

MyRecyclerViewAdapter.java

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

    private String[] mData = new String[0];
    private LayoutInflater mInflater;

    // Data is passed into the constructor
    public MyRecyclerViewAdapter(Context context, String[] data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }

    // Inflates the cell layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recyclerview_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    // Binds the data to the textview in each cell
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String animal = mData[position];
        holder.myTextView.setText(animal);
    }

    // Total number of cells
    @Override
    public int getItemCount() {
        return mData.length;
    }

    // Stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView myTextView;

        public ViewHolder(View itemView) {
            super(itemView);
            myTextView = (TextView) itemView.findViewById(R.id.info_text);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            onItemClick(view, getAdapterPosition());
        }
    }

    // Convenience method for getting data at click position
    public String getItem(int id) {
        return mData[id];
    }

    // Method that executes your code for the action received
    public void onItemClick(View view, int position) {
        Log.i("TAG", "You clicked number " + getItem(position).toString() + ", which is at cell position " + position);
    }
}

Lütfen onItemClickşimdi tanımlanan yöntemin MyRecyclerViewAdapter, alınan etkinlik / eylem için görevlerinizi kodlamak istediğiniz yer olduğuna dikkat edin .

Bu dönüşümü tamamlamak için yapılması gereken sadece küçük bir değişiklik var: FaaliyetinMyRecyclerViewAdapter.ItemClickListener artık uygulanması gerekmiyor çünkü artık tamamen Adaptör tarafından yapılıyor . Bu, son değişiklik olacaktır:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    MyRecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // data to populate the RecyclerView with
        String[] data = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"};

        // set up the RecyclerView
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvNumbers);
        int numberOfColumns = 6;
        recyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
        adapter = new MyRecyclerViewAdapter(this, data);
        adapter.setClickListener(this);
        recyclerView.setAdapter(adapter);
    }
}

3
Etkinliğin tıklama etkinliklerini dinlemesi gerekiyorsa ne olur? örneğin, verileri sunucuya aktarma, tıklanan öğeye göre bazı mantık yapma, izleme vb.
Ahmad Fadli

Bağdaştırıcının, içinde veri bulunan öğeler bulunduğundan tıklama etkinliklerini işlemesi gerektiğini kabul ediyorum. @AhmadFadli, bağdaştırıcının ana bilgisayarında (bir Parça veya Etkinlik) bir iş yapmanız gerekiyorsa, ihtiyacınız olan yöntemlerle bir geri arama arabirimi oluşturmalısınız. Ana makineniz bu arayüzü uygular. Ve sonra ana makinenizin bir örneğini Bağdaştırıcı yapıcısına geçirirsiniz. Ana bilgisayar örneğine sahip olmak, Adaptörünüzden ihtiyacınız olduğunda yöntemlerini çağırabilirsiniz. Ve sunucunuz geri aramalar alıyoruz. Bu genellikle ActionMode ile çalışmanız gerektiğinde kullanılır. Öğeleri seçmek ve ActionBar düğmelerini kullanmak için tıklayın.
Kirill Karmazin

Ben katılmıyorum ve tıklama olayları barındırma işlenmesi gerektiğini düşünüyorum Activity. Sadece tıklama dinleyici hakkında bilmek Çünkü Activitygörüntülemeleri ve diğer Fragments, Activitiesvb adaptör sadece üst seviyeye olayları tıklayarak gönderebilirsiniz. ItemClickListener Birçok olay adaptörünün görünümlerinin üretebileceği gibi, birçok olayla arayüze sahip olmalıdır . Bu çözüm daha önce yazılmıştır: stackoverflow.com/a/40563598/2914140 .
CoolMind

4

Recyclerview layoutmanager'inizi Gridlayout Mode'a Ayarlamanız Gerekir, Bunun İçin Bunu Yapın RecyclerView LayoutManager'ınızı Ayarlamak İstediğinizde Kodunuzu Değiştirin:

Not: İstediğiniz Sütun Sayınızı ### HELP ### ile değiştirin

   recyclerView.setLayoutManager(new GridLayoutManager(getActivity(),###HELP###));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.