2016-04-10 11 views
2

seçilmiş, her şey yolunda. Daha sonra bunun için onClick olayını ayarladım, böylece bir öğeyi her tıklattığımda, rengi sarıya döner. MainActivity'da yazdığım OnClick işlevi. Sorun şu ki, test ettiğimde, sadece bu maddenin rengini değiştirmez, aynı zamanda 2 madde değişir. Bunu okudum çünkü manzarayı yeniden kullanıyorum.Xamarin, Hem ListView ve RecyclerView, bir öğeyi tıklayın diğeri ben <code>ListView</code> yarattı, ben Başlangıçta hem <code>ListView</code> ve <code>RecyclerView</code></p> <p>bir sorun yaşıyorum

Bu yüzden, taktiklerimi değiştiriyorum, RecyclerView yerine ancak aynı sorunla karşılaşıyorum. Rengini değiştirmek için bir öğeye tıkladığımda, diğeri de değişir. Sanırım, ListView ve RecyclerView öğelerinin her ikisi de bir öğeyi tıklattığımda karıştırdıkları için yeniden Öğeler.

Bu sorunu nasıl çözeceğimi bilmiyorum, bir çözümün hangi öğeye tıklandığını işaret eden boolean dizisini eklemek olduğunu buldum ancak işe yaramadı. Herhangi bir fikrin var mı? Yani burada

Ben Xamarin site https://developer.xamarin.com/guides/android/user_interface/recyclerview/

üzerinde OnClic k işleyicisi için örnek izledi

public class CustomAdapter : RecyclerView.Adapter 
    { 
     public Activity _activity; 
     public List<Row> lst; 
     public event EventHandler<int> ItemClick; 

     public CustomAdapter(List<Row> lst, Activity activity) 
     { 
      this.lst = lst; 
      this._activity = activity; 
     } 

     public override int ItemCount 
     { 
      get 
      { 
       return lst.Count; 
      } 
     } 

     public void OnClick(int position) 
     { 
      if (ItemClick!=null) 
      { 
       ItemClick(this, position); 
      } 
     } 

     public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) 
     { 
      MyViewHolder myholder = holder as MyViewHolder; 

      myholder.textView1.Text = lst[position].field1; 
      myholder.textView2.Text = lst[position].field2; 
      myholder.textView3.Text = lst[position].field3; 
      myholder.textView4.Text = lst[position].field4; 
      myholder.textView5.Text = lst[position].field5; 
      myholder.textView6.Text = lst[position].field6; 


     } 

     public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) 
     { 
      View v = this._activity.LayoutInflater.Inflate(Resource.Layout.item, parent, false); 

      TextView tv1 = (TextView)v.FindViewById(Resource.Id.textView1); 
      TextView tv2 = (TextView)v.FindViewById(Resource.Id.textView2); 
      TextView tv3 = (TextView)v.FindViewById(Resource.Id.textView3); 
      TextView tv4 = (TextView)v.FindViewById(Resource.Id.textView4); 
      TextView tv5 = (TextView)v.FindViewById(Resource.Id.textView5); 
      TextView tv6 = (TextView)v.FindViewById(Resource.Id.textView6); 

      MyViewHolder holder = new MyViewHolder(v, OnClick) { textView1 = tv1, textView2 = tv2, textView3 = tv3, textView4 = tv4, textView5 = tv5, textView6 = tv6 }; 
      return holder; 
     } 
    } 

    class MyViewHolder : RecyclerView.ViewHolder 
    { 
     public TextView textView1, textView2, textView3, textView4, textView5, textView6; 
     public View mainView; 

     public MyViewHolder(View view, Action<int> listener) : base(view) 
     { 
      mainView = view; 
      mainView.Click += (sender, e) => listener(base.Position); 
     } 
    } 

kod MainActivity

class MainActivity : Activity 
    { 
     public RecyclerView recyclerView; 
     public RecyclerView.LayoutManager manager; 
     public RecyclerView.Adapter adapter; 
     List<Row> lst; 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      // Set our view from the "main" layout resource 
      SetContentView(Resource.Layout.Main); 
      init(); 
      recyclerView = (RecyclerView)FindViewById(Resource.Id.recyclerView); 
      manager = new LinearLayoutManager(this); 
      recyclerView.SetLayoutManager(manager); 
      CustomAdapter adapter = new CustomAdapter(lst, this); 
      adapter.ItemClick += onItemClick; 
      recyclerView.SetAdapter(adapter); 
     } 

     public void init() 
     { 
      lst = new List<Row>(); 
      for (int i = 0; i < 15; i++) 
      { 
       Row row = new Row() { field1="1:43:00", field2="09-Apr-16", field3="KPI/Overflow", field4="Kevin Bacon", field5="Unowned", field6= "People Counting @ IPCAM-ID-C-1-1" }; 
       lst.Add(row); 
      } 
     } 
     public void onItemClick(object sender, int position) 
     { 
      int itemPos = position + 1; 
      //Toast.MakeText(this, "this is " + itemPos, ToastLength.Short).Show(); 
      recyclerView.GetChildAt(position).SetBackgroundColor(Android.Graphics.Color.Green); 
     } 
    } 

özel bağdaştırıcı olduğunu

+0

Başkalarının size – Pooya

+0

sayesinde yardımcı olabilir böylece bugüne kadar yaptıklarını paylaşmak daha iyidir, ben kod eklemiş – LaXuanLinh

+0

da recyclerview için xml Lütfen paylaşın Madde – Pooya

cevap

2

Sorununuz kodunuzda. Olay işleyicinize doğru konumu gönderirsiniz, ancak daha sonra bunu Etkinlik'te birer birer artırırsınız. Her iki uç, eşya pozisyonunun 0 temelli endeksini kullanmalıdır. Bir tarafından artırmaya gerek yoktur.

Seçilen öğenin arka plan rengini değiştirmek için XML'de bir seçiciyi kullanabilirsiniz, böylece bunu kodda yapmanız gerekmez.

İşte bir örnek.

row_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_selected="true" android:color="@android:color/green" /> 
    <item android:state_selected="false" android:color="@android:color/transparent"/> 
</selector> 

row_content.axml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/row_layout_parent" 
    android:background="@drawable/row_selector"> 

    <!-- your row content --> 

</LinearLayout> 

Sonra görünümü tutucu ... Bu güncellendi olacağını

class MyViewHolder : RecyclerView.ViewHolder 
{ 
    public TextView textView1, textView2, textView3, textView4, textView5, textView6; 
    public View mainView; 
    private LinearLayout _layoutParent; 

    public MyViewHolder(View view, Action<int> listener) : base(view) 
    { 
     mainView = view; 
     _layoutParent = mainView.FindViewById<LinearLayout>(Resource.Id.row_layout_parent); 
     _layoutParent.Click += (sender, e) => _layoutParent.Selected = true; 
    } 
} 

Ben kaldırıldı diğer tıklama e havalandırma. Başka nedenlerden dolayı hala ihtiyacınız varsa, geri ekleyebilirsiniz, ancak seçildiğinde öğe arka plan rengini ayarlamak için gerekli değildir.

+0

Cevabınız için teşekkür ederim, daha önce hiç bir zaman XML seçicisini hiç duymadım, bu yüzden geldiğim tek şey tıklama olayı işleyicisidir. Aslında, tıklandığında öğe görünümünü değiştirmem gerekiyor, bunu nasıl yapacağımı bulamadım, setBackgroundResource ve Inflater'ı işleyicide denedim ama çalışmadı. Bu yüzden, her tıklattığımda rengini değiştirerek ilk önce Öğe tıklama etkinliğini test etmeyi düşünüyorum. Tıklandığında öğe görünümünü değiştirmek için seçiciyi kullanmanın bir örneğiniz var mı? – LaXuanLinh

+0

Yukarıdaki kodum çalışmalıdır. 'Row_selector.xml' dosyası' drawable' dizininde olmalıdır. –

0

Liste Görünümü için choiceMode'u aşağıdaki gibi ayarlamanız gerekir.

listView.ChoiceMode = ChoiceMode.Single; 

size yardımcı Umut:) -