RecyclerView滚动时挂起

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

我正在创建一个论坛应用。它具有类似于Facebook主页的主页。它包含带有视频和图像的帖子。当我滚动页面时,它挂了很多东西。我想知道如何使它像Facebook主页一样流畅。请帮助。

适配器代码:

public class PostListAdapter extends RecyclerView.Adapter<PostListAdapter.MyViewHolder> {


public CardView cardView;

Context context;


List<StoriesDatum> storiesDatumList;
StoriesDatum storiesDatum;

FragmentHome fragmentHome;
long elapsedDays, elapsedHours, elapsedMinutes, week, elapsedSeconds, months, year;
boolean isPressed;
public static ImageView ivFav;


SimpleExoPlayer exoPlayer;
String videoURL = "http://blueappsoftware.in/layout_design_android_blog.mp4";

int qty;

public PostListAdapter(Context context, List<StoriesDatum> storiesDatumList, FragmentHome fragmentHome) {
    this.context = context;
    this.storiesDatumList = storiesDatumList;
    this.fragmentHome = fragmentHome;
}


@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    final View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_post, parent, false);


    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {


    storiesDatum = storiesDatumList.get(position);

    holder.txtCommunityName.setText(storiesDatum.getComTitle());
    holder.txtPostTitle.setText(storiesDatum.getTitle());


    String story_body = String.valueOf(storiesDatum.getStoryBody());
    String story_type = String.valueOf(storiesDatum.getStoryType());
    String story_url = String.valueOf(storiesDatum.getStoryUrl());


    if (story_type.equals("1")) {
        holder.tvPost.setText(story_body);
        holder.tvPost.setVisibility(View.VISIBLE);
        holder.ivPost.setVisibility(View.GONE);
        holder.exoPlayerView.setVisibility(View.GONE);
        makeTextViewResizable(holder.tvPost, 3, "....View More", true);

    } else if (story_type.equals("2")) {
        holder.tvPost.setVisibility(View.GONE);
        holder.ivPost.setVisibility(View.VISIBLE);
        holder.exoPlayerView.setVisibility(View.GONE);

        if (story_url.startsWith("https://") || story_url.startsWith("http://")) {
            Glide.with(context).load(storiesDatum.getStoryUpload())
                    .placeholder(R.mipmap.top_communities_circle)
                    .error(R.drawable.ic_launcher_background)
                    .into(holder.ivPost);
        } else {
            Glide.with(context).load(Constants.image_url + storiesDatum.getStoryUpload())
                    .placeholder(R.mipmap.top_communities_circle)
                    .error(R.drawable.ic_launcher_background)
                    .into(holder.ivPost);
        }

        Log.e("tag", "image_url" + Constants.image_url + storiesDatum.getStoryUpload());
    } else {
        holder.tvPost.setVisibility(View.GONE);
        holder.ivPost.setVisibility(View.GONE);
        holder.exoPlayerView.setVisibility(View.VISIBLE);

        try {

            BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
            TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));
            exoPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelector);

            Uri videoURI;
            if (story_url != null) {
                videoURI = Uri.parse("http://66.42.57.85/tellit/public/uploads//157658624483.mp4");
            } else {
                videoURI = Uri.parse("http://66.42.57.85/tellit/public/uploads//157658624483.mp4");
            }


            DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("exoplayer_video");
            ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
            MediaSource mediaSource = new ExtractorMediaSource(videoURI, dataSourceFactory, extractorsFactory, null, null);

            holder.exoPlayerView.setPlayer(exoPlayer);
            exoPlayer.prepare(mediaSource);
            //exoPlayer.setPlayWhenReady(true);
        } catch (Exception e) {
            Log.e("MainAcvtivity", " exoplayer error " + e.toString());
        }
    }

    String comm_photo = String.valueOf(storiesDatum.getComImage());

    if (comm_photo.equals(null) || comm_photo.equals("null") || comm_photo.equals("")) {
        holder.ivImage.setImageResource(R.mipmap.top_communities_circle);
    } else {
        Glide.with(context).load(comm_photo)
                .placeholder(R.mipmap.top_communities_circle)
                .error(R.drawable.ic_launcher_background)
                .into(holder.ivImage);
    }
    holder.txtNamePosted.setText("Posted by " + storiesDatum.getUsername());

    String created_date = storiesDatum.getCreatedAt();

    Date startDate = null;
    Calendar calendar = Calendar.getInstance();
    Date todayStart = calendar.getTime();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
        startDate = format.parse(created_date);
    } catch (Exception e) {
        e.printStackTrace();
    }
    long cal = printDifference(startDate, todayStart);

    Log.e("DateFormat", "sdsds" + cal + "77" + created_date + startDate + "***" + todayStart);


    if (year == 0) {
        if (months == 0) {
            if (elapsedDays == 0) {
                if (elapsedHours == 0) {
                    if (elapsedMinutes > 1) {
                        holder.txtTime.setText((String.valueOf(elapsedMinutes) + " mins ago"));
                    } else {
                        holder.txtTime.setText((String.valueOf(elapsedMinutes) + " min ago"));
                    }
                } else {
                    if (elapsedHours > 1) {
                        holder.txtTime.setText((String.valueOf(elapsedHours) + " hours ago"));
                    } else {
                        holder.txtTime.setText((String.valueOf(elapsedHours) + " hour ago"));
                    }
                }
            } else {
                if (elapsedDays > 1) {
                    holder.txtTime.setText((String.valueOf(elapsedDays) + " days ago"));
                } else {
                    holder.txtTime.setText((String.valueOf(elapsedDays) + " day ago"));
                }
            }
        } else {
            if (months > 1) {
                holder.txtTime.setText((String.valueOf(months) + " months ago"));
            } else {
                holder.txtTime.setText((String.valueOf(months) + " month ago"));
            }
        }
    } else {
        if (year > 1) {
            holder.txtTime.setText((String.valueOf(year) + " years ago"));
        } else {
            holder.txtTime.setText((String.valueOf(year) + " year ago"));
        }
    }


    holder.txtCommentCount.setText(storiesDatum.getCommentsCount() + " Comments");
    holder.txtLikeCount.setText(storiesDatum.getStoryemojiCount() + " Reactions");


    holder.txtCommunityName.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            storiesDatum = storiesDatumList.get(position);
            fragmentHome.sendToCommunityPage(storiesDatum.getUserId(), storiesDatum.getComTitle(), storiesDatum.getCommunityId(), storiesDatum.getCommunity().getDescription(), storiesDatum.getComImage());
        }
    });
    holder.txtNamePosted.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            storiesDatum = storiesDatumList.get(position);
            fragmentHome.sendToUserProfile(storiesDatum.getUserId(), storiesDatum.getUsername());
        }
    });

    holder.ivAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            storiesDatum = storiesDatumList.get(position);
            fragmentHome.addCommunity(storiesDatum.getCommunityId());
        }
    });

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

            PopupWindow popupwindow_obj = popupDisplay(holder);
            int currentapiVersion = Build.VERSION.SDK_INT;
            if (currentapiVersion >= Build.VERSION_CODES.O) {
                Log.e("tag", "checked123");
                popupwindow_obj.showAsDropDown(holder.txtPostTitle, -10, -15);

            } else {
                Log.e("tag", "checked1233456");
                popupwindow_obj.showAsDropDown(holder.txtPostTitle, 0, 10);
            }


        }
    });
    Log.e("tag", "jpined_favourite" + storiesDatum.getJoined() + storiesDatum.getFav());
    if (storiesDatum.getJoined() == 0) {
        holder.ivAdd.setVisibility(View.VISIBLE);
    } else {
        holder.ivAdd.setVisibility(View.GONE);
    }
    if (storiesDatum.getFav() == 1) {

        holder.ivFav.setImageResource(R.mipmap.mark_as_favorite_filled);
    } else {


        holder.ivFav.setImageResource(R.mipmap.mark_favorite);
    }


    holder.txtComment.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            fragmentHome.openCommentbox();
        }
    });

    holder.ivFav.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            storiesDatum = storiesDatumList.get(position);

            if (storiesDatum.getFav() == 0) {
                fragmentHome.addFavt(storiesDatum.getCommunityId().toString(), "markfav");
            } else {
                fragmentHome.addFavt(storiesDatum.getCommunityId().toString(), "unmarkfav");
            }
        }
    });

    holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            fragmentHome.sendToSinglePost();
        }
    });

}

public long printDifference(Date startDate, Date endDate) {
    //milliseconds
    long different = endDate.getTime() - startDate.getTime();

    System.out.println("startDate : " + startDate);
    System.out.println("endDate : " + endDate);
    System.out.println("different : " + different);

    long secondsInMilli = 1000;
    long minutesInMilli = secondsInMilli * 60;
    long hoursInMilli = minutesInMilli * 60;
    long daysInMilli = hoursInMilli * 24;


    elapsedDays = different / daysInMilli;
    different = different % daysInMilli;

    elapsedHours = different / hoursInMilli;
    different = different % hoursInMilli;

    elapsedMinutes = different / minutesInMilli;
    different = different % minutesInMilli;

    elapsedSeconds = different / secondsInMilli;


    week = (elapsedDays / 7);
    months = (elapsedDays) / 30;
    year = months / 12;

    System.out.printf(
            "%d days, %d hours, %d minutes, %d seconds%n",
            elapsedDays, elapsedHours, elapsedMinutes, elapsedSeconds);


    Log.e("printDifference", "printDifference: " + week);


    return elapsedDays;
}

// call this method when required to show popup

public PopupWindow popupDisplay(final MyViewHolder holder) {

    final PopupWindow popupWindow = new PopupWindow(context);

    // inflate your layout or dynamically add view
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View view = inflater.inflate(R.layout.dialog_emoji, null);

    ImageView imgAdvice = (ImageView) view.findViewById(R.id.imgAdvice);
    ImageView imgLove = (ImageView) view.findViewById(R.id.imgLove);
    ImageView imgBrokenHeart = (ImageView) view.findViewById(R.id.imgBrokenHeart);
    ImageView imgEpic = (ImageView) view.findViewById(R.id.imgEpic);
    ImageView imgFunny = (ImageView) view.findViewById(R.id.imgFunny);


    ImageView imgHealMe = (ImageView) view.findViewById(R.id.imgHealMe);
    ImageView imgHearU = (ImageView) view.findViewById(R.id.imgHearU);
    ImageView imgMeToo = (ImageView) view.findViewById(R.id.imgMeToo);
    ImageView imgNoEgo = (ImageView) view.findViewById(R.id.imgNoEgo);
    ImageView imgRedFlag = (ImageView) view.findViewById(R.id.imgRedFlag);
    ImageView imgSolidarity = (ImageView) view.findViewById(R.id.imgSolidarity);
    ImageView imgTruth = (ImageView) view.findViewById(R.id.imgTruth);
    ImageView imgYellowFlag = (ImageView) view.findViewById(R.id.imgYellowFlag);
    ImageView imgTellMore = (ImageView) view.findViewById(R.id.imgTellMore);


    imgAdvice.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.advice);
            holder.txtLike.setText("Advice");
            popupWindow.dismiss();
        }
    });
    imgLove.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.love);
            holder.txtLike.setText("Love");
            popupWindow.dismiss();
        }
    });
    imgBrokenHeart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.broken_heart);
            holder.txtLike.setText("Broken Heart");
            popupWindow.dismiss();
        }
    });
    imgEpic.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.epic);
            holder.txtLike.setText("Epic");
            popupWindow.dismiss();
        }
    });
    imgFunny.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.funny);
            holder.txtLike.setText("Funny");
            popupWindow.dismiss();
        }
    });


    imgAdvice.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.advice);
            holder.txtLike.setText("Advice");
            popupWindow.dismiss();
        }
    });
    imgHealMe.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.heal_me);
            holder.txtLike.setText("Heal Me");
            popupWindow.dismiss();
        }
    });
    imgHearU.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.hear_you);
            holder.txtLike.setText("I Hear You");
            popupWindow.dismiss();
        }
    });
    imgMeToo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.me_too);
            holder.txtLike.setText("Me Too");
            popupWindow.dismiss();
        }
    });
    imgNoEgo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.no_ego);
            holder.txtLike.setText("No Ego");
            popupWindow.dismiss();
        }
    });


    imgRedFlag.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.red_flag);
            holder.txtLike.setText("Red Flag");
            popupWindow.dismiss();
        }
    });
    imgSolidarity.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.solidarity);
            holder.txtLike.setText("Solidarity");
            popupWindow.dismiss();
        }
    });
    imgTruth.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.truth);
            holder.txtLike.setText("Truth");
            popupWindow.dismiss();
        }
    });
    imgYellowFlag.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.yellow_flag);
            holder.txtLike.setText("Yellow Flag");
            popupWindow.dismiss();
        }
    });
    imgTellMore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.ivLike.setImageResource(R.mipmap.tellmore);
            holder.txtLike.setText("Tell More");
            popupWindow.dismiss();
        }
    });

    popupWindow.setFocusable(true);
    popupWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
    popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
    popupWindow.setContentView(view);
    popupWindow.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    return popupWindow;
}

public static void makeTextViewResizable(final TextView tv, final int maxLine, final String expandText, final boolean viewMore) {

    if (tv.getTag() == null) {
        tv.setTag(tv.getText());
    }
    ViewTreeObserver vto = tv.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @SuppressWarnings("deprecation")
        @Override
        public void onGlobalLayout() {
            String text;
            int lineEndIndex;
            ViewTreeObserver obs = tv.getViewTreeObserver();
            obs.removeGlobalOnLayoutListener(this);
            if (maxLine == 0) {
                lineEndIndex = tv.getLayout().getLineEnd(0);
                text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText;
            } else if (maxLine > 0 && tv.getLineCount() >= maxLine) {
                lineEndIndex = tv.getLayout().getLineEnd(maxLine - 1);
                text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText;
            } else {
                lineEndIndex = tv.getLayout().getLineEnd(tv.getLayout().getLineCount() - 1);
                text = tv.getText().subSequence(0, lineEndIndex) + " " + expandText;
            }
            tv.setText(text);
            tv.setMovementMethod(LinkMovementMethod.getInstance());
            tv.setText(
                    addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, lineEndIndex, expandText,
                            viewMore), TextView.BufferType.SPANNABLE);
        }
    });

}

private static SpannableStringBuilder addClickablePartTextViewResizable(final Spanned strSpanned, final TextView tv,
                                                                        final int maxLine, final String spanableText, final boolean viewMore) {
    String str = strSpanned.toString();
    SpannableStringBuilder ssb = new SpannableStringBuilder(strSpanned);

    if (str.contains(spanableText)) {


        ssb.setSpan(new MySpannable(false) {
            @Override
            public void onClick(View widget) {
                tv.setLayoutParams(tv.getLayoutParams());
                tv.setText(tv.getTag().toString(), TextView.BufferType.SPANNABLE);
                tv.invalidate();
                if (viewMore) {
                    makeTextViewResizable(tv, -1, "...View Less", false);
                } else {
                    makeTextViewResizable(tv, 3, "...View More", true);
                }
            }
        }, str.indexOf(spanableText), str.indexOf(spanableText) + spanableText.length(), 0);

    }
    return ssb;

}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}


@Override
public int getItemCount() {
    return storiesDatumList.size();
}

private static class ViewHolder {


}

public class MyViewHolder extends RecyclerView.ViewHolder {

    TextView txtNamePosted, txtCommunityName, txtPostTitle, tvPost, txtLike, txtComment, txtTime, txtCommentCount, txtLikeCount;
    Button btnPay;
    RelativeLayout layout, relativeLike, relativeLayout;
    LinearLayout linear;
    ImageView ivAdd, ivImage, ivLike, ivFav, ivPost;
    SimpleExoPlayerView exoPlayerView;
    ;


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

        layout = (RelativeLayout) itemView.findViewById(R.id.layout);
        txtNamePosted = (TextView) itemView.findViewById(R.id.txtNamePosted);
        txtPostTitle = (TextView) itemView.findViewById(R.id.txtPostTitle);
        ivAdd = (ImageView) itemView.findViewById(R.id.ivAdd);
        ivLike = (ImageView) itemView.findViewById(R.id.ivLike);
        ivFav = (ImageView) itemView.findViewById(R.id.ivFav);
        relativeLike = (RelativeLayout) itemView.findViewById(R.id.relativeLike);
        tvPost = (TextView) itemView.findViewById(R.id.tvPost);
        txtLike = (TextView) itemView.findViewById(R.id.txtLike);
        txtCommunityName = (TextView) itemView.findViewById(R.id.txtCommunityName);
        ivImage = (ImageView) itemView.findViewById(R.id.ivImage);
        txtComment = (TextView) itemView.findViewById(R.id.txtComment);
        txtTime = (TextView) itemView.findViewById(R.id.txtTime);
        txtCommentCount = (TextView) itemView.findViewById(R.id.txtCommentCount);
        txtLikeCount = (TextView) itemView.findViewById(R.id.txtLikeCount);
        relativeLayout = (RelativeLayout) itemView.findViewById(R.id.relativeLayout);
        ivPost = (ImageView) itemView.findViewById(R.id.ivPost);
        exoPlayerView = (SimpleExoPlayerView) itemView.findViewById(R.id.exo_player_view);
    }
}

}

通过片段呼叫适配器:

          JSONArray jsonArray = jsonObject.getJSONArray("data");

                            if (jsonArray.length() > 0) {

                                list.setVisibility(View.VISIBLE);
                                txtNoData.setVisibility(View.GONE);
                                List<StoriesDatum> datumArrayList = new ArrayList<>();

                                datumArrayList = Arrays.asList(gson.fromJson(jsonArray.toString(), StoriesDatum[].class));
                                final PostListAdapter postListAdapter = new PostListAdapter(getActivity(), datumArrayList, FragmentHome.this);
                                RecyclerView.LayoutManager LayoutManager1 = new LinearLayoutManager(getActivity());
                                list.setItemAnimator(new DefaultItemAnimator());
                                list.setLayoutManager(LayoutManager1);


                                // set elements to adapter
                                list.setAdapter(postListAdapter);


                            }

我不确定如何使它平滑滚动。请帮忙。我的页面仅包含15个项目。

android android-fragments android-recyclerview android-adapter android-scrollview
1个回答
0
投票

您的适配器确实非常繁重,尤其是onBindViewHolder方法。

一些提示:

  • 您不能在适配器中保留对片段的大量引用(删除FragmentHome并改用接口,],
  • 在每个创建重磅ViewHolder的新实例中,您都应将播放视频委托给新屏幕,
  • 整个适配器充满逻辑。阅读有关MVP或MVVM设计模式的信息,还应考虑针对特定情况制作多个ViewHolders,以避免额外的ExoPlayer逻辑。
© www.soinside.com 2019 - 2024. All rights reserved.