SwipeRefreshLayout返回bug

问题描述 投票:0回答:1

我正在使用带有SwipeRefeshLayoutRecycleView。这个recycleView包含view-holders,它具有改变显示的点击功能。这工作正常,直到我多次刷新视图。例如:如果我刷新它5次,点击viewholder,我将在返回按钮上单击5次以返回recycleview片段。

代码:HomeFragment.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;
            }
        };
    }
}

}

c# android xamarin swiperefreshlayout
1个回答
0
投票

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

因此,每次在RecyclerView中刷新项目时,都会调用OnBindViewHolder。如果您的列表比屏幕上显示的更长,并且您可以向上和向下滚动,也会发生这种情况。

相反,你应该在Click中分配OnCreateViewHolder,所以它只被连接一次,而不是每次都被显示。

© www.soinside.com 2019 - 2024. All rights reserved.