• 1398/04/17

استفاده از متد NotifyDataSetChanged :

سلام استاد،
من توی برنامه ام از یه Recycler View استفاده کردم که یک چک باکس داخلش قرار داره.

برای مثال وقتی که روی آیتم 1 کلیک میشه و چک ش true میشه آیتم 8 هم همراهش چک ش true میشه (همزمان)

با چندتا سرچ فهمیدم که باید از متد NotifyDataSetChanged داخل آداپتر استفاده کنم اما این متد روش استفاده خاصی رو داره

ممنون میشم راهنمایی کنید که چطور و کجا از این متد استفاده کنم.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Support.V7.Widget;
using Android.Views;
using Android.Widget;
using Todo.Data.Context;
using Todo.Data.Models;
using Todo.Utility;

namespace Todo.App
{
    class RvWorksAdapter : RecyclerView.Adapter, IItemClickListener
    {
        private List<Work> _lstWorks;
        private Activity _activity;

        public RvWorksAdapter(List<Work> list, Activity activity)
        {
            _lstWorks = list;
            _activity = activity;
        }
        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            RvWorksViewHolder view = holder as RvWorksViewHolder;

            Work work = _lstWorks[position];

            int hour = TimeDifference.HourDifference(work.StartHour, work.EndHour);
            int min = TimeDifference.MinuteDifference(work.StartMinute, work.EndMinute);

            view.TvTitle.Text = work.Title;
            if (hour == 0)
            {
                view.TvTime.Hint = $"{min} دقیقه";
            }
            else if (min == 0)
            {
                view.TvTime.Hint = $"{hour} ساعت";
            }
            else
            {
                view.TvTime.Hint = $"{hour} ساعت و {min} دقیقه";
            }
            view.ChbStatus.Checked = (work.StatusId == (int)StatusState.Normal) ? false : true;
            view.ChbStatus.CheckedChange += (sender, e) =>
            {
                TodoDatabase db = new TodoDatabase();

                if (e.IsChecked)
                {
                    work.StatusId = (int)StatusState.Completed;
                }
                else
                {
                    work.StatusId = (int)StatusState.Normal;
                }
                db.WorkRepository.EditAsync(work);
            };

            view.SetItemClickListener(this);
        }

        public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            View view = LayoutInflater.From(parent.Context)
                .Inflate(Resource.Layout.rv_works_item, parent, false);

            var tvTitle = view.FindViewById<TextView>(Resource.Id.tvWorkTitle);
            var tvTime = view.FindViewById<TextView>(Resource.Id.tvWorkTime);
            var chbStatus = view.FindViewById<CheckBox>(Resource.Id.chbWorkStatus);

            return new RvWorksViewHolder(view)
            {
                TvTitle = tvTitle,
                TvTime = tvTime,
                ChbStatus = chbStatus
            };
        }

        public void OnClick(View itemView, int position, bool isLongClick)
        {
            if (!isLongClick)
            {
                Intent intent = new Intent(_activity, typeof(AddWorkActivity));
                intent.PutExtra(AddWorkActivity.WORK_ID, _lstWorks[position].WorkId);
                _activity.StartActivityForResult(intent, WorkActivity.EDIT_REQUEST_CODE);
            }
        }

        public override int ItemCount { get => _lstWorks.Count; }
    }

    public class RvWorksViewHolder : RecyclerView.ViewHolder, View.IOnClickListener
    {
        public View View { get; set; }
        public TextView TvTitle { get; set; }
        public TextView TvTime { get; set; }
        public CheckBox ChbStatus { get; set; }
        private IItemClickListener _itemClickListener;

        public RvWorksViewHolder(View itemView) : base(itemView)
        {
            this.View = itemView;
            View.SetOnClickListener(this);
        }

        public void SetItemClickListener(IItemClickListener itemClickListener)
        {
            _itemClickListener = itemClickListener;
        }

        public void OnClick(View v)
        {
            _itemClickListener.OnClick(v, AdapterPosition, false);
        }
    }
}