SORU
22 Temmuz 2014, Salı


Neden't RecyclerView onİtemClickListener yok()? Ve nasıl RecyclerView Liste Görünümü farklıdır?

Doğru soruyu sordum mu bilmiyorum. RecyclerView keşfediyordum ve RecyclerView onItemClickListener() olmadığını görünce çok şaşırdım. RecyclerView genişletir çünkü

android.görünüm.ViewGroup

ve ListView uzanır

android.widget.AbsListView

. Ancak RecyclerView.Adapter benim: onClick yazarak sorunumu çözdüm

public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {

    public TextView txtViewTitle;
    public ImageView imgViewIcon;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
        imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
    }

    @Override
    public void onClick(View v) {

    }
}

Ama hala onItemClickListener() kaldırıldı neden bilmek istiyorum?

Bir performans sorunu veya başka bir şey var mı?

CEVAP
24 Temmuz 2014, PERŞEMBE


tl;drhttp://www.littlerobots.nl/blog/Handle-Android-RecyclerView-Clicks/

12*, onItemClickListener *beri giriş sorunlu olmuştur. O anda bir tık dinleyici için herhangi bir iç öğeleri geri olmaz tetikledi ama değildi Tebliğ veya iyi belgelenmiş (eğer) bu yüzden bir çok karışıklık ve soru hakkında.

Verilen RecyclerView alır bir adım daha ileri ve yok kavramını bir satır/sütun, bir ya da daha çok keyfi olarak düzenlendiği miktarın çocuklar, onlar temsil edilen özelliği her biri, ya da programcı uygulanması.

Karmaşık durumlarda kullanmak için daha esnek bir bileşen olarak *1:1* 16 yerine değil Recyclerview düşün. Ve dediğiniz gibi, çözüm google sana ne bekleniyor. Şimdi bir arayüzü ListView Recyclerview hem de doğru deseni olan yapıcı, kabul etmek özelliği temsilci edebilecek bir adaptör var.

public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {

    public TextView txtViewTitle;
    public ImageView imgViewIcon;
    public IMyViewHolderClicks mListener;


    public ViewHolder(View itemLayoutView, IMyViewHolderClicks listener) {
        super(itemLayoutView);
        mListener = listener;
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
        imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
        imgViewIcon.setOnClickListener(this);
        itemLayoutView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v instanceof Imageview){
           mListener.onTomato((ImageView)v)
        } else {
           mListener.onPotato(v);
        }
    }

    public static interface IMyViewHolderClicks {
        public void onPotato(View caller);
        public void onTomato(ImageView callerImage);
    }

}

ve sonra adaptör üzerinde

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

   String[] mDataset = { "Data" };

   @Override
   public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                  int viewType) {
       View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.my_layout, parent, false);

       MyAdapter.ViewHolder vh = new ViewHolder(v, new MyAdapter.ViewHolder.IMyViewHolderClicks() { 
           public void onPotato(View caller) { Log.d("Poh-tah-tos"); };
           public void onTomato(ImageView callerImage) { Log.d("To-m8-tohs"); }
        });
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) {
        // Get element from your dataset at this position 
        // Replace the contents of the view with that element 
        // Clear the ones that won't be used
        holder.txtViewTitle.setText(mDataset[position]);

    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
        return mDataset.length;
    } 

  ...

Şimdi kod son parçayı da içine bak: onCreateViewHolder(ViewGroup parent, int viewType) imza zaten farklı görünüm türlerini öneririm. Bunların her biri için farklı bir viewholder çok ihtiyacınız olacak, ve daha sonra her bir tıklama farklı bir dizi olabilir. Ya da sadece herhangi bir görünüm ve 22 ** bir tane alır ve buna göre geçerli bir genel viewholder oluşturabilirsiniz. Ya da bazı parçalar var bu yüzden duvarı için bir düzey temsilci/etkinlikler farklı tıklama davranışı ile aynı liste var. Yine, tüm esneklik sizden yana.

Gerçekten gerekli bir bileşen ve bizim iç ve uygulamaları ListView iyileştirmeler şimdiye kadar ne oldukça yakın. Google sonunda kabul iyi oldu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alex maybury

    alex maybury

    20 Aralık 2007
  • Chip Johnson

    Chip Johnson

    30 AĞUSTOS 2007
  • SoundHound

    SoundHound

    8 Mart 2006