我正在创建一个论坛应用。它具有类似于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个项目。
您的适配器确实非常繁重,尤其是onBindViewHolder
方法。
一些提示:
FragmentHome
并改用接口,],ViewHolder
的新实例中,您都应将播放视频委托给新屏幕,ExoPlayer
逻辑。