ItemTouchHelper onSwiped() не обновляет данные из конструктора

Итак, я создал класс для обработки событий смахивания:

public class CardViewSwipeListener : ItemTouchHelper.Callback
{
   private Context context;
   private List<Person> listWithData;
   private const int RESET_ADAPTER = 1;

    public CardViewSwipeListener(Context context, List<Person> listWithData)
    {
        this.context = context;
        this.listWithData = listWithData;
    }

    public override int GetMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
    {
        int swipeFlags = ItemTouchHelper.Start | ItemTouchHelper.End;
        return MakeMovementFlags(0, swipeFlags);
    }

    public override bool OnMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
    {
        return true;
    }   

    public override void OnSwiped(RecyclerView.ViewHolder viewHolder, int direction)
    {
        if (direction == ItemTouchHelper.End)
        {
            ((Activity)context).StartActivityForResult(new Intent(Intent.ActionCall, Android.Net.Uri.Parse(string.Format("tel:{0}", listWithData[viewHolder.AdapterPosition].PhoneNumber))),RESET_ADAPTER);
            Toast.MakeText(context,"Call "+listWithData[viewHolder.AdapterPosition].Name,ToastLength.Short).Show();
        }
        else if (direction == ItemTouchHelper.Start)
        {
            ((Activity)context).StartActivityForResult(new Intent(Intent.ActionView, Android.Net.Uri.Parse(string.Format("sms:{0}", this.listWithData[viewHolder.AdapterPosition].PhoneNumber))),RESET_ADAPTER;
            Toast.MakeText(context, "SMS " + this.listWithData[viewHolder.AdapterPosition].Name, ToastLength.Short).Show();
        }
    }
}

В MainActivivty onCreate я использую следующий код, чтобы предоставить представление рециркулятора для обработки событий смахивания.

        itemTouchHelper   = new ItemTouchHelper(new CardViewSwipeListener(this, listWithData));

        recycler = FindViewById<RecyclerView>(Resource.Id.recycler);
        recycler.HasFixedSize = true;
        layoutManager = new LinearLayoutManager(this);
        recycler.SetLayoutManager(layoutManager);
        recycler.SetAdapter(new RecyclerViewAdapter(listWithData,this));
        itemTouchHelper.AttachToRecyclerView(recycler);

Проблема в том, что мне нужно изменить listWithData на другой, но когда я делаю это, onSwipe не учитывает никаких изменений.

Нет результата:

itemTouchHelper   = new ItemTouchHelper(new CardViewSwipeListener(this, NewList));
        recycler.SetAdapter(new RecyclerViewAdapter(NewList,this));
        itemTouchHelper.AttachToRecyclerView(recycler);

Решения Java-кода также принимаются)

Заранее спасибо.

1 ответ

Решение

Проблема в том, что мне нужно изменить listWithData на другой, но когда я делаю это, onSwipe не учитывает никаких изменений.

Вы могли бы написать Interface слушать событие увольнения из ItemTouchHelper.Callback:

public interface IItemHelper
{
    //Called when an item has been dismissed by a swipe.
    void onItemDismiss(int position);
}

Воплощать в жизнь IItemHelper интерфейс в вашем RecyclerViewAdapter учебный класс:

public class MyRecyclerViewAdapter : RecyclerView.Adapter,IItemHelper
{
    List<string> items;

    ...

    public MyRecyclerViewAdapter(List<string> data)
    {
        items = data;
    }

    ...

    //Called when an item has been dismissed by a swipe.
    public void onItemDismiss(int position)
    {
        items.RemoveAt(position);
        NotifyItemRemoved(position);
    }
}

Когда вы проводите Предмет, скажите адаптеру отклонить этот предмет:

public class CardViewSwipeListener : ItemTouchHelper.Callback
{ 
     ...

     public override void OnSwiped(RecyclerView.ViewHolder viewHolder, int direction)
    {
        if (direction == ItemTouchHelper.End)
        {
            ...
        }
        else if (direction == ItemTouchHelper.Start)
        {
            ...
        }
        recyclerViewAdapter.onItemDismiss(viewHolder.AdapterPosition);
    }
}

Эффект, как это.

Другие вопросы по тегам