2016-04-10 8 views
2

を選択し、私はListViewを作成し、すべてが正常です。次に、項目をクリックするたびに色が黄色に変わるように、onClickイベントを設定します。 MainActivityに書いたOnClickの機能です。問題は、私がテストすると、そのアイテムが色を変えるだけでなく、2アイテムが変わるということです。私はそれを再利用したからだということを読んだ。Xamarin、ListViewコントロールとRecyclerViewの両方が、一つの項目をクリックし、別の1は私が<code>ListView</code>と<code>RecyclerView</code>最初</p> <p>の両方に問題を抱えている

代わりにRecyclerViewを使用して私の戦術を切り替えますが、同じ問題が発生します。ある項目をクリックして色を変更すると、下の項目も変更されます。私はListViewRecyclerViewの両方がこれらのアイテムを再利用して、それらをクリックすると混乱するからだと思います。

この問題を解決する方法がわかりませんが、解決策は、booleanという配列を追加して、どのアイテムがクリックされたのかはわかりますが動作しません。どんなアイデアみたいな?だからここ

は私がXamarin site https://developer.xamarin.com/guides/android/user_interface/recyclerview/

OnClic Kハンドラの例を踏襲

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

コード 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); 
     } 
    } 

カスタムアダプタです

+0

あなたは他の人があなたに – Pooya

+0

感謝を助けることができるので、あなたがこれまでに行ったこと共有している場合、それは良いです、私は、コードを追加した – LaXuanLinh

+0

もrecyclerviewのためのあなたのxmlを共有してくださいitem – Pooya

答えて

2

コードに問題があります。イベントハンドラに正しい位置を送信しますが、アクティビティで1つ増分します。両端は、項目位置の0から始まるインデックスを使用する必要があります。 1つずつ増やす必要はありません。

選択した項目の背景色を変更するには、XMLでセレクタを使用することができますので、コード内でこれを行う必要はありません。

ここは例です。

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> 

その後、あなたのビューホルダーは、これに更新される...

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

私は削除他のクリックeベント。他の理由でそれが必要な場合は、追加することもできますが、選択すると項目の背景色を設定する必要はありません。

+0

あなたの返事をありがとう、私はXMLセレクタについて聞いたことがないので、私が来たのはすべてクリックイベントハンドラです。実際には、アイテムビューをクリックしたときに変更する必要があります。その方法を見つけられませんでした。setBackgroundResourceとInflaterをハンドラーで試しましたが、機能しませんでした。だから私はクリックするたびにその色を変えることでItem Clickイベントをまずテストすると思う。セレクタを使用してクリックしたときにアイテムビューを変更する例はありますか? – LaXuanLinh

+0

上記のコードがうまくいくはずです。 'row_selector.xml'ファイルは' drawable'ディレクトリになければなりません。 –

0

リストビューでは、次のようにchoiceModeを設定する必要があります。

listView.ChoiceMode = ChoiceMode.Single; 

は、それはあなたを助けるホープ:) -

関連する問題

 関連する問題