滑动刷新布局返回错误



我正在使用一个里面有RecycleViewSwipeRefeshLayout。此recycleView包含具有更改显示的单击功能的view-holders。这工作正常,直到我多次刷新视图。例如:如果我刷新 5 次,单击一个viewholder,我将不得不在返回按钮上单击 5 次才能返回到recycleview片段。

代码:首页片段.cs:

       private void HandleRefresh(object sender, EventArgs e)
       {
        try
        {
            page = 0;
            adapter.clearMoments();
            RefreshData(adapter, 0);
            mySwipeRefreshLayout.Refreshing = false;
        }

        private async void RefreshData(MomentAdapterRV adapter, int page)
        {
        JsonValue json = await model.getMoments(page);
        try
        {
            InitData(adapter, json, page);
        }
        private void InitData(MomentAdapterRV adapter, JsonValue json, int pageNum)
    {
        var myActivity = (MainActivity)this.Activity;
        try
        {
            if (json.Count > 0)
            {               
                for (var i = 0; i < json.Count; i++)
                {                     
                    // Some code
                    adapter.addMoment(Moment moment)
                }
                   // Some code
            }
        }

MomentAdapterRV.cs:

    public MomentAdapterRV(Context context, List<Moment> items, MainActivity activity)
    {
        mItems = items;
        mContext = context;
        mActivity = activity;
        cb = CommunityBuilderModel.Instance;
    }
    /// <summary>
    /// This is the constuctor function of this adapter where the given class arguments (streamFragment, Moments) are being passed to the class variables.
    /// </summary>
    /// <param name="streamFragement"></param>
    /// <param name="mItems"></param>
    public MomentAdapterRV(StreamFragment streamFragement, List<Moment> mItems)
    {
        this.streamFragement = streamFragement;
        this.mItems = mItems;
    }
    public void addMoment(Moment moment)
    {
        mItems.Add(moment);            
        NotifyDataSetChanged();
    }
    public void clearMoments()
    {
        mItems.Clear();
    }
    public override RecyclerView.ViewHolder
               OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        View itemView = LayoutInflater.From(parent.Context).
                    Inflate(Resource.Layout.MomentListItem, parent, false);
        MomentViewHolder vh = new MomentViewHolder(itemView);
        return vh;
    }
    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
         // Some code
        vh.llMain.Click += (object sender, EventArgs e) =>
        {
            //Check if you don't get a negative position from the header.
            if (holder.AdapterPosition >= 0)
            {
                // Create a new fragment and a transaction.
                FragmentTransaction fragmentTx = mActivity.FragmentManager.BeginTransaction();
                MomentFragment aDifferentDetailsFrag = new MomentFragment();
                // Some code
                // Replace the fragment that is in the View fragment_container (if applicable).
                fragmentTx.Replace(Resource.Id.frameLayout1, aDifferentDetailsFrag);
                // Add the transaction to the back stack.
                fragmentTx.AddToBackStack(null);
                // Commit the transaction.
                fragmentTx.Commit();
                //Put Argument
                aDifferentDetailsFrag.Arguments = utilBundle;
            }
        };
    }
}

}

您的问题是您在OnBindViewHolder中分配了Click事件,并且从不取消订阅此点击事件。

因此,每次刷新回收器视图中的项目时,都会调用OnBindViewHolder。如果您的列表长度超过屏幕上可以显示的长度并且您上下滚动,也会发生这种情况。

相反,即使在OnCreateViewHolder中,您也应该分配Click,以便它只挂接一次,而不是每次显示时。

最新更新