Add same fragment second time (add more then one time fragment) then RecyclerView scroll lagging

房东的猫 提交于 2020-04-05 06:48:13

问题


  • Add same fragment second time (add more then one time fragment) then RecyclerView scroll lagging
  • I am using fragment reusability .but add second time fragment then start this problem.
  • I am remove image load library but not any improvement i am face same problem.
  • I am also check this link click
  • add fragment then facing this problem. but replace fragment then not facing this problem
  • more add fragment then RecyclerView lagging. i think fragment memory issue

Every time user click see all related video and get list related video and again detail page. this all time add fragment call more than two times then RecyclerView lagging check this flow this image

this flow continuously more than two times then creating this issue

call fragment data

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

    RelatedFragment relatedFragment = new RelatedFragment();
    Bundle bundle = new Bundle();
    bundle.putString("type", "related");
    bundle.putString("post_id", statusLists.getId());
    bundle.putString("cat_id", statusLists.getCid());
    bundle.putString("typeLayout", "Landscape");
    relatedFragment.setArguments(bundle);
    getActivity().getSupportFragmentManager().beginTransaction().add(R.id.frameLayout_main, relatedFragment, string).addToBackStack(string).commitAllowingStateLoss();
}

});

xml file

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView_sub_category"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginStart="5dp"
    android:layout_marginTop="5dp" />

Fragment

public class RelatedFragment extends Fragment {

private Method method;
private OnClick onClick;
private String type, post_id, cat_id, typeLayout;
private ProgressBar progressBar;
private MaterialTextView textView_noData;
private RecyclerView recyclerView;
private List<SubCategoryList> relatedLists;
private SubCategoryAdapter subCategoryAdapter;
private LayoutAnimationController animation;
private Boolean isOver = false;
private int pagination_index = 1;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = LayoutInflater.from(getActivity()).inflate(R.layout.portrait_fragment, container, false);

    GlobalBus.getBus().register(this);

    MainActivity.toolbar.setTitle(getResources().getString(R.string.related_status));

    relatedLists = new ArrayList<>();

    onClick = new OnClick() {
        @Override
        public void position(int position, String title, String type, String status_type, String id, String tag) {

            SCDetailFragment scDetailFragment = new SCDetailFragment();
            Bundle bundle = new Bundle();
            bundle.putString("id", id);
            bundle.putString("type", type);
            bundle.putString("status_type", status_type);
            bundle.putInt("position", position);
            scDetailFragment.setArguments(bundle);
            getActivity().getSupportFragmentManager().beginTransaction().add(R.id.frameLayout_main, scDetailFragment, title).addToBackStack(title).commitAllowingStateLoss();

        }
    };
    method = new Method(getActivity(), onClick);

    assert getArguments() != null;
    type = getArguments().getString("type");
    post_id = getArguments().getString("post_id");
    cat_id = getArguments().getString("cat_id");
    typeLayout = getArguments().getString("typeLayout");

    int resId = R.anim.layout_animation_fall_down;
    animation = AnimationUtils.loadLayoutAnimation(getActivity(), resId);

    progressBar = view.findViewById(R.id.progressbar_portrait_fragment);
    textView_noData = view.findViewById(R.id.textView_portrait_fragment);

    recyclerView = view.findViewById(R.id.recyclerView_portrait_fragment);

    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);

    recyclerView.setHasFixedSize(true);
    recyclerView.addOnScrollListener(new EndlessRecyclerViewScrollListener(layoutManager) {
        @Override
        public void onLoadMore(int page, int totalItemsCount) {
            if (!isOver) {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        pagination_index++;
                        callData();
                    }
                }, 1000);
            } else {
                subCategoryAdapter.hideHeader();
            }
        }
    });

    callData();

    setHasOptionsMenu(true);
    return view;
}

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.search_menu, menu);

    MenuItem searchItem = menu.findItem(R.id.ic_searchView);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener((new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            if (method.isNetworkAvailable()) {
                backStackRemove();
                SearchFragment searchFragment = new SearchFragment();
                Bundle bundle = new Bundle();
                bundle.putString("search_menu", query);
                bundle.putString("typeLayout", "Landscape");
                searchFragment.setArguments(bundle);
                getActivity().getSupportFragmentManager()
                        .beginTransaction().replace(R.id.frameLayout_main, searchFragment, query).commitAllowingStateLoss();
                return false;
            } else {
                method.alertBox(getResources().getString(R.string.internet_connection));
            }
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return true;
        }
    }));

    super.onCreateOptionsMenu(menu, inflater);
}

private void backStackRemove() {
    for (int i = 0; i < getActivity().getSupportFragmentManager().getBackStackEntryCount(); i++) {
        getActivity().getSupportFragmentManager().popBackStack();
    }
}

@Subscribe
public void getNotify(Events.FavouriteNotify favouriteNotify) {
    for (int i = 0; i < relatedLists.size(); i++) {
        if (relatedLists.get(i).getId().equals(favouriteNotify.getId())) {
            if (relatedLists.get(i).getStatus_type().equals(favouriteNotify.getStatus_type())) {
                relatedLists.get(i).setIs_favourite(favouriteNotify.getIs_favourite());
                subCategoryAdapter.notifyItemChanged(i);
            }
        }
    }
}

@Subscribe
public void getMessage(Events.InfoUpdate infoUpdate) {
    if (subCategoryAdapter != null) {
        for (int i = 0; i < relatedLists.size(); i++) {
            if (relatedLists.get(i).getId().equals(infoUpdate.getId())) {
                if (relatedLists.get(i).getStatus_type().equals(infoUpdate.getStatus_type())) {
                    switch (infoUpdate.getType()) {
                        case "all":
                            relatedLists.get(i).setTotal_viewer(infoUpdate.getView());
                            relatedLists.get(i).setTotal_likes(infoUpdate.getTotal_like());
                            relatedLists.get(i).setAlready_like(infoUpdate.getAlready_like());
                            break;
                        case "view":
                            relatedLists.get(i).setTotal_viewer(infoUpdate.getView());
                            break;
                        case "like":
                            relatedLists.get(i).setTotal_likes(infoUpdate.getTotal_like());
                            relatedLists.get(i).setAlready_like(infoUpdate.getAlready_like());
                            break;
                    }
                    subCategoryAdapter.notifyItemChanged(i);
                }
            }
        }
    }
}

private void callData() {
    if (getActivity() != null) {
        if (method.isNetworkAvailable()) {
            if (method.pref.getBoolean(method.pref_login, false)) {
                related(method.pref.getString(method.profileId, null), post_id, cat_id, typeLayout);
            } else {
                related("0", post_id, cat_id, typeLayout);
            }
        } else {
            method.alertBox(getResources().getString(R.string.internet_connection));
        }
    }
}

private void related(String userId, String post_id, String cat_id, String typeLayout) {

    if (subCategoryAdapter == null) {
        relatedLists.clear();
        progressBar.setVisibility(View.VISIBLE);
    }

    if (getActivity() != null) {

        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams params = new RequestParams();
        JsonObject jsObj = (JsonObject) new Gson().toJsonTree(new API(getActivity()));
        jsObj.addProperty("method_name", "related_status");
        jsObj.addProperty("post_id", post_id);
        jsObj.addProperty("cat_id", cat_id);
        jsObj.addProperty("user_id", userId);
        jsObj.addProperty("page", pagination_index);
        jsObj.addProperty("filter_value", typeLayout);
        jsObj.addProperty("lang_ids", method.pref.getString(method.language_ids, ""));
        params.put("data", API.toBase64(jsObj.toString()));
        client.post(Constant_Api.url, params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

                if (getActivity() != null) {

                    String res = new String(responseBody);

                    try {
                        JSONObject jsonObject = new JSONObject(res);

                        if (jsonObject.has(Constant_Api.STATUS)) {

                            String status = jsonObject.getString("status");
                            String message = jsonObject.getString("message");
                            if (status.equals("-2")) {
                                method.suspend(message);
                            } else {
                                method.alertBox(message);
                            }

                        } else {

                            JSONArray jsonArray = jsonObject.getJSONArray(Constant_Api.tag);

                            for (int i = 0; i < jsonArray.length(); i++) {

                                JSONObject object = jsonArray.getJSONObject(i);
                                String id = object.getString("id");
                                String status_type = object.getString("status_type");
                                String status_title = object.getString("status_title");
                                String status_layout = object.getString("status_layout");
                                String status_thumbnail_b = object.getString("status_thumbnail_b");
                                String status_thumbnail_s = object.getString("status_thumbnail_s");
                                String total_likes = object.getString("total_likes");
                                String total_viewer = object.getString("total_viewer");
                                String category_name = object.getString("category_name");
                                String already_like = object.getString("already_like");
                                String quote_bg = object.getString("quote_bg");
                                String quote_font = object.getString("quote_font");
                                String is_favourite = object.getString("is_favourite");

                                relatedLists.add(new SubCategoryList("", id, status_type, status_title, status_layout, status_thumbnail_b, status_thumbnail_s, total_viewer, total_likes, already_like, category_name, quote_bg, quote_font, is_favourite, "", ""));

                            }

                            if (jsonArray.length() == 0) {
                                if (subCategoryAdapter != null) {
                                    isOver = true;
                                    subCategoryAdapter.hideHeader();
                                }
                            }

                            if (subCategoryAdapter == null) {
                                if (relatedLists.size() == 0) {
                                    textView_noData.setVisibility(View.VISIBLE);
                                } else {
                                    textView_noData.setVisibility(View.GONE);
                                    subCategoryAdapter = new SubCategoryAdapter(getActivity(), relatedLists, onClick, type);
                                    recyclerView.setAdapter(subCategoryAdapter);
                                    recyclerView.setLayoutAnimation(animation);
                                }
                            } else {
                                subCategoryAdapter.notifyDataSetChanged();
                            }

                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                        method.alertBox(getResources().getString(R.string.failed_try_again));
                    }

                }

                progressBar.setVisibility(View.GONE);

            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                progressBar.setVisibility(View.GONE);
                method.alertBox(getResources().getString(R.string.failed_try_again));
            }
        });

    }

}

@Override
public void onDestroyView() {
    super.onDestroyView();
    // Unregister the registered event.
    GlobalBus.getBus().unregister(this);
}

}

Adapter

    public class SubCategoryAdapter extends RecyclerView.Adapter {

    private Activity activity;
    private Method method;
    private int columnWidth;
    private String type;
    private Animation myAnim;
    private List<SubCategoryList> subCategoryLists;

    private final int VIEW_TYPE_LOADING = 0;
    private final int VIEW_TYPE_ITEM = 1;
    private final int VIEW_TYPE_QUOTES = 2;

    public SubCategoryAdapter(Activity activity, List<SubCategoryList> subCategoryLists, OnClick interstitialAdView, String type) {
        this.activity = activity;
        this.type = type;
        this.subCategoryLists = subCategoryLists;
        method = new Method(activity, interstitialAdView);
        columnWidth = (method.getScreenWidth());
        myAnim = AnimationUtils.loadAnimation(activity, R.anim.bounce);
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_ITEM) {
            View view = LayoutInflater.from(activity).inflate(R.layout.sub_category_adapter, parent, false);
            return new ViewHolder(view);
        } else if (viewType == VIEW_TYPE_QUOTES) {
            View v = LayoutInflater.from(activity).inflate(R.layout.quotes_adapter, parent, false);
            return new Quotes(v);
        } else if (viewType == VIEW_TYPE_LOADING) {
            View v = LayoutInflater.from(activity).inflate(R.layout.layout_loading_item, parent, false);
            return new ProgressViewHolder(v);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, @SuppressLint("RecyclerView") final int position) {

        if (holder.getItemViewType() == VIEW_TYPE_ITEM) {

            final ViewHolder viewHolder = (ViewHolder) holder;

            if (status_type.equals("gif")) {
                Glide.with(activity)
                        .asBitmap()
                        .load(subCategoryLists.get(position).getStatus_thumbnail_s())
                        .placeholder(R.drawable.placeholder_landscape).into(viewHolder.imageView);

            } else {
                Glide.with(activity)
                        .load(subCategoryLists.get(position).getStatus_thumbnail_s())
                        .placeholder(R.drawable.placeholder_landscape).into(viewHolder.imageView);
            }

            viewHolder.imageView.setLayoutParams(new RelativeLayout.LayoutParams(columnWidth, columnWidth / 2 - 60));

            viewHolder.textView_title.setText(subCategoryLists.get(position).getStatus_title());

            viewHolder.relativeLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    method.onClickData(position, subCategoryLists.get(position).getStatus_title(), type, subCategoryLists.get(position).getStatus_type(), subCategoryLists.get(position).getId(), "");
                }
            });

        } else if (holder.getItemViewType() == VIEW_TYPE_QUOTES) {

            final Quotes quotes = (Quotes) holder;

            quotes.relativeLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, columnWidth / 2));

            Typeface typeface = Typeface.createFromAsset(activity.getAssets(), "text_font/" + subCategoryLists.get(position).getQuote_font());
            quotes.textView.setTypeface(typeface);

            quotes.textView.setText(subCategoryLists.get(position).getStatus_title());
            quotes.textView.post(new Runnable() {
                @Override
                public void run() {
                    ViewGroup.LayoutParams params = quotes.textView.getLayoutParams();
                    if (params == null) {
                        params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
                    }
                    final int widthSpec = View.MeasureSpec.makeMeasureSpec(quotes.textView.getWidth(), View.MeasureSpec.UNSPECIFIED);
                    final int heightSpec = View.MeasureSpec.makeMeasureSpec(quotes.textView.getHeight(), View.MeasureSpec.UNSPECIFIED);
                    quotes.textView.measure(widthSpec, heightSpec);
                    quotes.textView.setMaxLines(heightSpec / quotes.textView.getLineHeight());
                    quotes.textView.setEllipsize(TextUtils.TruncateAt.END);
                }
            });

            quotes.linearLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    method.onClickData(position, subCategoryLists.get(position).getStatus_title(), type, subCategoryLists.get(position).getStatus_type(), subCategoryLists.get(position).getId(), "");
                }
            });

        }
    }

    @Override
    public int getItemCount() {
        return subCategoryLists.size() + 1;
    }

    public void hideHeader() {
        ProgressViewHolder.progressBar.setVisibility(View.GONE);
    }

    @Override
    public int getItemViewType(int position) {

        if (position != subCategoryLists.size()) {
            if (subCategoryLists.get(position).getStatus_type().equals("quote")) {
                return VIEW_TYPE_QUOTES;
            } else {
                return VIEW_TYPE_ITEM;
            }
        } else {
            return VIEW_TYPE_LOADING;
        }

    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private RelativeLayout relativeLayout;
        private ImageView imageView;
        private MaterialTextView textView_title;

        public ViewHolder(View itemView) {
            super(itemView);

            relativeLayout = itemView.findViewById(R.id.relativeLayout_subCat_adapter);
            imageView = itemView.findViewById(R.id.imageView_subCat_adapter);
            textView_title = itemView.findViewById(R.id.textView_title_subCat_adapter);

        }
    }

    public class Quotes extends RecyclerView.ViewHolder {

        private LinearLayout linearLayout;
        private RelativeLayout relativeLayout;
        private MaterialTextView textView;

        public Quotes(@NonNull View itemView) {
            super(itemView);

            linearLayout = itemView.findViewById(R.id.ll_quotes_adapter);
            textView = itemView.findViewById(R.id.textView_quotes_adapter);
            relativeLayout = itemView.findViewById(R.id.rel_quotes_adapter);

        }
    }

    public static class ProgressViewHolder extends RecyclerView.ViewHolder {
        public static ProgressBar progressBar;

        public ProgressViewHolder(View v) {
            super(v);
            progressBar = v.findViewById(R.id.progressBar);
        }
    } }

来源:https://stackoverflow.com/questions/60880908/add-same-fragment-second-time-add-more-then-one-time-fragment-then-recyclervie

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!