2016-04-11 55 views
1

Bir metin görünümü ve birkaç düğme içeren bir liste görünümüne sahip olduğum bir uygulamayı kodluyorum.Liste görünümü Bağdaştırıcı da liste davranışından "davranış" sorumlu olmalıdır?

Liste görünümü bağdaştırıcısında, bir liste görünümü öğesi için görünüm oluşturduğumda, olay işleyicilerini, davranışı kesinlikle bu liste görünümünün metin görünümünün değerine bağlı olan düğmelere ekliyorum.

Şimdi, sorum şu: her ne kadar olay işleyicileri, bağdaştırıcıdaki görünümü oluştururken düğmelere düğmelerdeki en iyi şey gibi görünse de, olay işleyicilerinin de bağdaştırıcıya sahip olması iyi bir fikir midir? Bunun işe yarayacağını biliyorum, ancak benimki kodunun yargısının ayrılmasıyla ilgili bir endişe. Bir adaptörün düğmelerin ne zaman ateşlendiğini de içerdiği biraz garip. Olay işleyicilerinin, bağdaştırıcıdansa liste görünümünü içeren etkinlikte daha iyi bir ev bulabileceğini düşünüyor musunuz? Senin düşüncen nedir? Bence İçin

+0

Dude seç, cevabım size yardım yaptı? –

cevap

1

- evet, haklısınız, olay işleyicileri Adapter yılında, ListView değil içeren, Activity/Fragment olmalıdır.

Belki böyle olursa benim yaklaşım ideal değildir, ama işte burada:
Ben Adaptörü bir arayüz yapmak (ya da dışında olursa olsun), örneğin

public interface MyAdapterCallback { 
     void buttonClicked(int buttonId, int position, int param2); 
    } 

Tabii, geçebilir istediğin kadar params.

Adapter yapıcıda Bu arabirimi uygulayarak nesnenin örneğini geçiriyorum (Activity'un kendisi).
O zaman benim Activity bu arabirimi uygular ve istenen eylemleri gerçekleştirdiğim buttonClicked()'u geçersiz kılar.

Ve MyAdapter içinde OnClickListeners düğmelerini, numaralı düğmeleri onClick() numaralı telefona koydum _callback.buttonClicked(passing your params)'u arayın.


Umut bu yanıtın yararlı :)

Güncelleme oldu.
Tamam, arayüz kullanmadan bir cevap vereceğim.
senin Activity böyle OnClickListener uygulamak edelim: Sonra

public class MainActivity implements View.OnClickListener{ 

    @Override 
    public void onClick(View v) { 
     //do your actions here 
    } 
} 

, burada Adapter kısmen hayata geçirilmesidir: Düğmeye bastığınızda Bu durumda

public class MyAdapter extends ArrayAdapter<String> { 
    private MainActivity _mainActivity; 

    public MyAdapter(Context context, int resource, MainActivity mainActivity) { 
     super(context, resource); 
     _mainActivity = mainActivity; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button button; 
     button.setOnClickListener(_mainActivity); 
     return super.getView(position, convertView, parent); 
    } 
} 

, - onClick MainActivity içinde olacak olarak adlandırılabilir.

Bir seçenek daha.

public class MainActivity { 
    public void onButtonInAdapterClick(your params) { 
     //do your actions here 
    } 
} 

Ve Adapter:
senin böyle Activity olun

public class MyAdapter extends ArrayAdapter<String> { 
    private MainActivity _mainActivity; 

    public MyAdapter(Context context, int resource, MainActivity mainActivity) { 
     super(context, resource); 
     _mainActivity = mainActivity; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button button; 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       _mainActivity.onButtonInAdapterClick(your params); 
      } 
     }); 
     return super.getView(position, convertView, parent); 
    } 
} 

ihtiyacınız seçeneği)

+0

Üzgünüz, C# 'ya biraz yeni geldim, bu yüzden almadığım bir kısım var .. Arayüzün örneğini geçtiğini söylüyorsunuz, ancak arayüzlerin örnekleri olamaz? –

+0

Bu arabirimi uygulayarak bir nesneyi iletiyorum (bir cevabı düzenledim). Evet, arayüzün kendisi örnekleri olamaz. Ve benim kodum Java için;) –

+0

Evet bunu düşündüm .. :) Dürüst olmak gerekirse, OOP hakkında daha iyi anlamak istediğim bir şey varsa, arayüzler, bu yüzden cevabınızı cevaplamaktan çekiniyordum. Bunu yargılayabilmek için gereken becerilere sahip değilim ...: \ Belki arayüzler kullanmadan bir çözüm önerirseniz, sizi destekleyecek durumda olabilirim :) Cevabınızda verdiğiniz detay için çok teşekkürler. belki bundan bir süre önce buna geri dönebilirim ve tam olarak takdir edebilirim. –