从 activity 返回后 RecyclerView 滚动变慢
RecyclerView Scrolling slows after returning from activity
我正在使用 Firebase Firestore 编写 news/article 应用程序。而且,我使用 RecyclerView 列出具有恒定高度的项目(具有恒定高度的图像视图,文本视图)。这个过程是在 FragmentNews 上完成的,当我单击该项目以查看详细信息时,有另一个 activity 的意图。返回 activity(单击返回)后,recyclerview 滚动 变慢 。我读了旧的答案,但他们帮不了我,
这是我的代码 Recyclerview 适配器代码
package com.fabrika.gunes;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.preference.PreferenceManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
public class MyRecMultiAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements MySubMultiRecListAdapter.ItemClickListenerSub{
private Context context;
public static ArrayList<MakalaModel> list;
static ItemClickListener mClickListener;
SharedPreferences preferences;
String isWifiEnabled = "0", isOnlyWifi = "0";
public MyRecMultiAdapter(Context context, ArrayList<MakalaModel> list) {
this.context = context;
this.list = list;
preferences = PreferenceManager.getDefaultSharedPreferences(context);
isWifiEnabled = preferences.getString("wifi_enabled", "0");
isOnlyWifi = preferences.getString("wifi_only", "0");
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if(viewType==0){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_makala_vertical, parent, false);
NormMakalaHolder postHolder = new NormMakalaHolder(view);
return postHolder;
}
else if(viewType==1){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.makala_rec_row, parent, false);
RecMakalaHolder authorHolder = new RecMakalaHolder(view);
return authorHolder;
}
return null;
}
public static ArrayList<MakalaModel> getList(){
return list;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(getItemViewType(position)==0){
MakalaModel postModel = list.get(position);
NormMakalaHolder postHolder = (NormMakalaHolder) holder;
postHolder.t_category.setText(postModel.getArticle_author());
String firstWord = postModel.getArticle_title();
String secondWord = postModel.getArticle_body().substring(0,150)+"...";
postHolder.t_view.setText(""+postModel.getArticle_view_number());
// Create a new spannable with the two strings
Spannable spannable = new SpannableString(firstWord+ ". " +secondWord);
// Set the custom typeface to span over a section of the spannable object
Typeface typeface1 = ResourcesCompat.getFont(context, R.font.nunitosans_extra_bold);
Typeface typeface2 = ResourcesCompat.getFont(context, R.font.nunitosans_light);
spannable.setSpan( new CustomTypefaceSpan("sans-serif", typeface1), 0, firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan( new CustomTypefaceSpan("sans-serif", typeface2), firstWord.length(), firstWord.length() + secondWord.length()+2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// Set the text of a textView with the spannable object
postHolder.t_title.setText( spannable );
String url = list.get(position).getArticle_img_url();
if(isOnlyWifi.equals("1") && isWifiEnabled.equals("0")){
url = "";
}
try {
Glide
.with(context)
.load(new URL(url))
.centerCrop()
.placeholder(R.drawable.mini_map)
.into(postHolder.i_image);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
else{
ArrayList<MakalaModel> listMakala = list.get(position).getListMakalaModel();
MySubMultiRecListAdapter adapter = new MySubMultiRecListAdapter(context, listMakala);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
((RecMakalaHolder) holder).recyclerView.setAdapter(adapter);
((RecMakalaHolder) holder).recyclerView.setLayoutManager(layoutManager);
// LinearSnapHelper linearSnapHelper = new SnapHelperOneByOne();
// linearSnapHelper.attachToRecyclerView(((RecMakalaHolder) holder).recyclerView);
adapter.setClickListenerSub(this);
}
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public int getItemViewType(int position) {
return list.get(position).getViewType();
}
@Override
public void onItemClick(View view, int position, ArrayList<MakalaModel> list) {
Intent intent = new Intent(context, ActivityMakala.class);
intent.putExtra("id", list.get(position).getMakala_id());
intent.putExtra("type", "Articles");
intent.putExtra("category", list.get(position).getArticle_category());
intent.putExtra("date", list.get(position).getArticle_date());
intent.putExtra("title", list.get(position).getArticle_title());
intent.putExtra("author", list.get(position).getArticle_author());
intent.putExtra("body", list.get(position).getArticle_body());
intent.putExtra("img_url", list.get(position).getArticle_img_url());
context.startActivity(intent);
}
public class RecMakalaHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
RecyclerView recyclerView;
public RecMakalaHolder(@NonNull View itemView) {
super(itemView);
recyclerView = itemView.findViewById(R.id.recyclerView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (MyRecMultiAdapter.mClickListener != null) mClickListener.onItemClick(v, getAdapterPosition(), MyRecMultiAdapter.getList());
}
}
public class NormMakalaHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView t_category, t_title, t_view;
ImageView i_image;
public NormMakalaHolder(@NonNull View itemView) {
super(itemView);
t_category = itemView.findViewById(R.id.t_category);
t_title = itemView.findViewById(R.id.t_title);
i_image = itemView.findViewById(R.id.i_image);
t_view = itemView.findViewById(R.id.t_view);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (MyRecMultiAdapter.mClickListener != null) mClickListener.onItemClick(v, getAdapterPosition(), MyRecMultiAdapter.getList());
}
}
// parent activity will implement this method to respond to click events
public interface ItemClickListener {
void onItemClick(View view, int position, ArrayList<MakalaModel> list);
}
// allows clicks events to be caught
public void setClickListenerSub(ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
}
而且,这是我的 FragmentNews 代码
package com.fabrika.gunes;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.IntentCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;
import com.google.firebase.storage.FirebaseStorage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FragmentMakala extends Fragment implements MyRecMultiAdapter.ItemClickListener{
View view;
Toolbar toolbar;
public static ArrayList<MakalaModel> makalaObjects;
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
MainActivity activity;
MyRecMultiAdapter adapter;
FloatingActionButton buttonInsertArticle;
HashMap<String, Boolean> likedArticles;
FirebaseFirestore db;
FirebaseStorage storage = FirebaseStorage.getInstance();
SharedPreferences preferences;
String[] likedArray;
long article_number = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_makala, container, false);
prepareMe();
getMakala();
buttonInsertArticle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// for admin
// insertEmptyArticle();
}
});
return view;
}
private void insertEmptyArticle() {
// Create a new user with a first and last name
Map<String, Object> article = new HashMap<>();
article.put("article_author", "Serdaryň pikirleri");
article.put("article_body", "");
article.put("article_category", "durmuş");
article.put("article_date", "01.05.2021");
article.put("article_dislike_number", 0);
article.put("article_img_url", "");
article.put("article_like_number", 0);
article.put("article_title", "");
article.put("article_valid", true);
article.put("article_view_number", 0);
// Add a new document with a generated ID
db.collection("Articles")
.document(""+article_number)
.set(article);
article_number++;
Map<String, Object> article_num = new HashMap<>();
article_num.put("article_number", article_number);
db.collection("Articles")
.document("0")
.set(article_num);
}
private void prepareMe() {
// ((MainActivity)getActivity()).updateStatusBarColor("#ffffff");
setHasOptionsMenu(true);//Add this sentence to the menu
toolbar = view.findViewById(R.id.toolbar);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
((AppCompatActivity) getActivity()).getSupportActionBar().setElevation(0);
toolbar.setTitle("Iň täze makalalar");
toolbar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(activity, "refresh", Toast.LENGTH_SHORT).show();
getMakala();
}
});
buttonInsertArticle = view.findViewById(R.id.buttonInsertNewArticle);
preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
activity = (MainActivity) getActivity();
recyclerView = view.findViewById(R.id.recyclerView);
makalaObjects = new ArrayList<>();
isWifiEnabled();
db = FirebaseFirestore.getInstance();
layoutManager = new LinearLayoutManager(view.getContext(), LinearLayoutManager.VERTICAL, false);
adapter = new MyRecMultiAdapter(view.getContext(), makalaObjects);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(layoutManager);
adapter.setClickListenerSub(this);
likedArticles = new HashMap<>();
String ids = preferences.getString("liked_articles","");
likedArray = ids.split(" ");
recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(2);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
// adapter.setHasStableIds(true);
}
public void initScrollView(){
if(makalaObjects.size()>3){
ArrayList<MakalaModel> scrollList = new ArrayList<>();
String ids = preferences.getString("liked_articles","");
likedArray = ids.split(" ");
for(int i=likedArray.length-1;i>=0;i--){
for(int j=makalaObjects.size()-1;j>=0;j--){
if(likedArray[i].equals(makalaObjects.get(j).getMakala_id())){
scrollList.add(makalaObjects.get(j));
}
}
}
MakalaModel m = new MakalaModel();
m.setListMakalaModel(scrollList);
m.setViewType(1);
makalaObjects.set(3,m);
}
}
@Override
public void onItemClick(View view, int position, ArrayList<MakalaModel> list) {
Intent intent = new Intent(activity.getApplicationContext(), ActivityMakala.class);
intent.putExtra("type", "Articles");
intent.putExtra("position", position);
intent.putExtra("id", makalaObjects.get(position).getMakala_id());
intent.putExtra("category", makalaObjects.get(position).getArticle_category());
intent.putExtra("date", makalaObjects.get(position).getArticle_date());
intent.putExtra("title", makalaObjects.get(position).getArticle_title());
intent.putExtra("author", makalaObjects.get(position).getArticle_author());
intent.putExtra("body", makalaObjects.get(position).getArticle_body());
intent.putExtra("img_url", makalaObjects.get(position).getArticle_img_url());
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);
}
private void getMakala() {
makalaObjects.clear();
// adapter = null;
// activity.llprogress.setVisibility(View.VISIBLE);
db.collection("Articles").get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
if(!queryDocumentSnapshots.isEmpty()){
List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();
for(DocumentSnapshot d : list){
MakalaModel makalaModel = d.toObject(MakalaModel.class);
makalaModel.setMakala_id(d.getId());
makalaModel.setViewType(0);
if(!makalaModel.getMakala_id().equals("0"))
makalaObjects.add(makalaModel);
else{
article_number = makalaModel.getArticle_number();
}
}
// Collections.reverse(makalaObjects);
makalaObjects.sort((schedule1, schedule2)->{
int returnValue = 0;
if(Integer.parseInt(schedule1.getMakala_id()) > Integer.parseInt(schedule2.getMakala_id())) return -1;
else if(Integer.parseInt(schedule1.getMakala_id()) < Integer.parseInt(schedule2.getMakala_id())) return 1;
return returnValue;
});
ArrayList<MakalaModel> scrollList = new ArrayList<>();
for(int i=likedArray.length-1;i>=0;i--){
for(int j=makalaObjects.size()-1;j>=0;j--){
if(likedArray[i].equals(makalaObjects.get(j).getMakala_id())){
scrollList.add(makalaObjects.get(j));
}
}
}
MakalaModel m = new MakalaModel();
m.setListMakalaModel(scrollList);
m.setViewType(1);
makalaObjects.add(3,m);
adapter.notifyDataSetChanged();
// adapter = new MyRecMultiAdapter(activity.getApplicationContext(), makalaObjects);
// recyclerView.setAdapter(adapter);
activity.llprogress.setVisibility(View.GONE);
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(activity, "error", Toast.LENGTH_SHORT).show();
activity.llprogress.setVisibility(View.GONE);
}});
}
@Override
public void onResume() {
super.onResume();
isWifiEnabled();
initScrollView();
adapter.notifyDataSetChanged();
}
public boolean isWifiEnabled(){
ConnectivityManager cm = (ConnectivityManager) activity.getApplicationContext().getSystemService(
Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (wifiNetwork != null && wifiNetwork.isConnected()) {
SharedPreferences.Editor editor = preferences.edit();
editor.putString("wifi_enabled", "1");
editor.commit();
return true;
}
SharedPreferences.Editor editor = preferences.edit();
editor.putString("wifi_enabled", "0");
editor.commit();
return false;
}
}
我的item_list_makala_vertical.xml代码(recyclerview的列表项)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="400dp"
android:paddingVertical="5dp"
android:paddingHorizontal="15dp">
<TextView
android:id="@+id/t_category"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="WHAT TO COOK"
android:textSize="14sp"
android:fontFamily="@font/nunitosans_black"
android:textStyle="bold"
android:textColor="@color/colorBlack"/>
<TextView
android:id="@+id/t_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorBlack"
android:fontFamily="@font/verdana"
android:textSize="18sp"
android:layout_marginTop="5dp"
android:layout_below="@+id/t_category"
android:text="New Recipes for Your Rotation Add vegan tantanment and roasted rhubarb cobbler to your weekend cooking plans."/>
<ImageView
android:id="@+id/i_image"
android:layout_width="match_parent"
android:layout_height="250dp"
android:src="@drawable/mini_map"
android:scaleType="centerCrop"
android:layout_marginTop="7dp"
android:layout_below="@+id/t_title"/>
<RelativeLayout
android:id="@+id/r_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/i_image">
<TextView
android:id="@+id/t_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="27.04.2021"
android:textSize="12sp"
android:fontFamily="@font/nunitosans_light"
android:textStyle="bold"
android:alpha="0.6"
android:layout_marginTop="5dp"
android:textColor="@color/colorBlack"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/t_view"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:src="@drawable/ic_view"/>
<TextView
android:id="@+id/t_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="24"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:textSize="12sp"
android:fontFamily="@font/nunitosans_bold"
android:textStyle="bold"
android:layout_marginTop="5dp"
android:textColor="@color/colorBlack"/>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/colorBlack"
android:layout_below="@+id/r_bottom"
android:layout_marginTop="15dp"/>
</RelativeLayout>
感谢您的帮助...
使用 gilde 加载图像时使用以下代码:
Glide.with(context).load(new URL(url))
.thumbnail(0.5f)
.centerCrop()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(postHolder.i_image);
更好地分页您的新闻数据。
我正在使用 Firebase Firestore 编写 news/article 应用程序。而且,我使用 RecyclerView 列出具有恒定高度的项目(具有恒定高度的图像视图,文本视图)。这个过程是在 FragmentNews 上完成的,当我单击该项目以查看详细信息时,有另一个 activity 的意图。返回 activity(单击返回)后,recyclerview 滚动 变慢 。我读了旧的答案,但他们帮不了我, 这是我的代码 Recyclerview 适配器代码
package com.fabrika.gunes;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.preference.PreferenceManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
public class MyRecMultiAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements MySubMultiRecListAdapter.ItemClickListenerSub{
private Context context;
public static ArrayList<MakalaModel> list;
static ItemClickListener mClickListener;
SharedPreferences preferences;
String isWifiEnabled = "0", isOnlyWifi = "0";
public MyRecMultiAdapter(Context context, ArrayList<MakalaModel> list) {
this.context = context;
this.list = list;
preferences = PreferenceManager.getDefaultSharedPreferences(context);
isWifiEnabled = preferences.getString("wifi_enabled", "0");
isOnlyWifi = preferences.getString("wifi_only", "0");
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if(viewType==0){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_makala_vertical, parent, false);
NormMakalaHolder postHolder = new NormMakalaHolder(view);
return postHolder;
}
else if(viewType==1){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.makala_rec_row, parent, false);
RecMakalaHolder authorHolder = new RecMakalaHolder(view);
return authorHolder;
}
return null;
}
public static ArrayList<MakalaModel> getList(){
return list;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(getItemViewType(position)==0){
MakalaModel postModel = list.get(position);
NormMakalaHolder postHolder = (NormMakalaHolder) holder;
postHolder.t_category.setText(postModel.getArticle_author());
String firstWord = postModel.getArticle_title();
String secondWord = postModel.getArticle_body().substring(0,150)+"...";
postHolder.t_view.setText(""+postModel.getArticle_view_number());
// Create a new spannable with the two strings
Spannable spannable = new SpannableString(firstWord+ ". " +secondWord);
// Set the custom typeface to span over a section of the spannable object
Typeface typeface1 = ResourcesCompat.getFont(context, R.font.nunitosans_extra_bold);
Typeface typeface2 = ResourcesCompat.getFont(context, R.font.nunitosans_light);
spannable.setSpan( new CustomTypefaceSpan("sans-serif", typeface1), 0, firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan( new CustomTypefaceSpan("sans-serif", typeface2), firstWord.length(), firstWord.length() + secondWord.length()+2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// Set the text of a textView with the spannable object
postHolder.t_title.setText( spannable );
String url = list.get(position).getArticle_img_url();
if(isOnlyWifi.equals("1") && isWifiEnabled.equals("0")){
url = "";
}
try {
Glide
.with(context)
.load(new URL(url))
.centerCrop()
.placeholder(R.drawable.mini_map)
.into(postHolder.i_image);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
else{
ArrayList<MakalaModel> listMakala = list.get(position).getListMakalaModel();
MySubMultiRecListAdapter adapter = new MySubMultiRecListAdapter(context, listMakala);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
((RecMakalaHolder) holder).recyclerView.setAdapter(adapter);
((RecMakalaHolder) holder).recyclerView.setLayoutManager(layoutManager);
// LinearSnapHelper linearSnapHelper = new SnapHelperOneByOne();
// linearSnapHelper.attachToRecyclerView(((RecMakalaHolder) holder).recyclerView);
adapter.setClickListenerSub(this);
}
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public int getItemViewType(int position) {
return list.get(position).getViewType();
}
@Override
public void onItemClick(View view, int position, ArrayList<MakalaModel> list) {
Intent intent = new Intent(context, ActivityMakala.class);
intent.putExtra("id", list.get(position).getMakala_id());
intent.putExtra("type", "Articles");
intent.putExtra("category", list.get(position).getArticle_category());
intent.putExtra("date", list.get(position).getArticle_date());
intent.putExtra("title", list.get(position).getArticle_title());
intent.putExtra("author", list.get(position).getArticle_author());
intent.putExtra("body", list.get(position).getArticle_body());
intent.putExtra("img_url", list.get(position).getArticle_img_url());
context.startActivity(intent);
}
public class RecMakalaHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
RecyclerView recyclerView;
public RecMakalaHolder(@NonNull View itemView) {
super(itemView);
recyclerView = itemView.findViewById(R.id.recyclerView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (MyRecMultiAdapter.mClickListener != null) mClickListener.onItemClick(v, getAdapterPosition(), MyRecMultiAdapter.getList());
}
}
public class NormMakalaHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView t_category, t_title, t_view;
ImageView i_image;
public NormMakalaHolder(@NonNull View itemView) {
super(itemView);
t_category = itemView.findViewById(R.id.t_category);
t_title = itemView.findViewById(R.id.t_title);
i_image = itemView.findViewById(R.id.i_image);
t_view = itemView.findViewById(R.id.t_view);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (MyRecMultiAdapter.mClickListener != null) mClickListener.onItemClick(v, getAdapterPosition(), MyRecMultiAdapter.getList());
}
}
// parent activity will implement this method to respond to click events
public interface ItemClickListener {
void onItemClick(View view, int position, ArrayList<MakalaModel> list);
}
// allows clicks events to be caught
public void setClickListenerSub(ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
}
而且,这是我的 FragmentNews 代码
package com.fabrika.gunes;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.IntentCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;
import com.google.firebase.storage.FirebaseStorage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FragmentMakala extends Fragment implements MyRecMultiAdapter.ItemClickListener{
View view;
Toolbar toolbar;
public static ArrayList<MakalaModel> makalaObjects;
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
MainActivity activity;
MyRecMultiAdapter adapter;
FloatingActionButton buttonInsertArticle;
HashMap<String, Boolean> likedArticles;
FirebaseFirestore db;
FirebaseStorage storage = FirebaseStorage.getInstance();
SharedPreferences preferences;
String[] likedArray;
long article_number = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_makala, container, false);
prepareMe();
getMakala();
buttonInsertArticle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// for admin
// insertEmptyArticle();
}
});
return view;
}
private void insertEmptyArticle() {
// Create a new user with a first and last name
Map<String, Object> article = new HashMap<>();
article.put("article_author", "Serdaryň pikirleri");
article.put("article_body", "");
article.put("article_category", "durmuş");
article.put("article_date", "01.05.2021");
article.put("article_dislike_number", 0);
article.put("article_img_url", "");
article.put("article_like_number", 0);
article.put("article_title", "");
article.put("article_valid", true);
article.put("article_view_number", 0);
// Add a new document with a generated ID
db.collection("Articles")
.document(""+article_number)
.set(article);
article_number++;
Map<String, Object> article_num = new HashMap<>();
article_num.put("article_number", article_number);
db.collection("Articles")
.document("0")
.set(article_num);
}
private void prepareMe() {
// ((MainActivity)getActivity()).updateStatusBarColor("#ffffff");
setHasOptionsMenu(true);//Add this sentence to the menu
toolbar = view.findViewById(R.id.toolbar);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
((AppCompatActivity) getActivity()).getSupportActionBar().setElevation(0);
toolbar.setTitle("Iň täze makalalar");
toolbar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(activity, "refresh", Toast.LENGTH_SHORT).show();
getMakala();
}
});
buttonInsertArticle = view.findViewById(R.id.buttonInsertNewArticle);
preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
activity = (MainActivity) getActivity();
recyclerView = view.findViewById(R.id.recyclerView);
makalaObjects = new ArrayList<>();
isWifiEnabled();
db = FirebaseFirestore.getInstance();
layoutManager = new LinearLayoutManager(view.getContext(), LinearLayoutManager.VERTICAL, false);
adapter = new MyRecMultiAdapter(view.getContext(), makalaObjects);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(layoutManager);
adapter.setClickListenerSub(this);
likedArticles = new HashMap<>();
String ids = preferences.getString("liked_articles","");
likedArray = ids.split(" ");
recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(2);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
// adapter.setHasStableIds(true);
}
public void initScrollView(){
if(makalaObjects.size()>3){
ArrayList<MakalaModel> scrollList = new ArrayList<>();
String ids = preferences.getString("liked_articles","");
likedArray = ids.split(" ");
for(int i=likedArray.length-1;i>=0;i--){
for(int j=makalaObjects.size()-1;j>=0;j--){
if(likedArray[i].equals(makalaObjects.get(j).getMakala_id())){
scrollList.add(makalaObjects.get(j));
}
}
}
MakalaModel m = new MakalaModel();
m.setListMakalaModel(scrollList);
m.setViewType(1);
makalaObjects.set(3,m);
}
}
@Override
public void onItemClick(View view, int position, ArrayList<MakalaModel> list) {
Intent intent = new Intent(activity.getApplicationContext(), ActivityMakala.class);
intent.putExtra("type", "Articles");
intent.putExtra("position", position);
intent.putExtra("id", makalaObjects.get(position).getMakala_id());
intent.putExtra("category", makalaObjects.get(position).getArticle_category());
intent.putExtra("date", makalaObjects.get(position).getArticle_date());
intent.putExtra("title", makalaObjects.get(position).getArticle_title());
intent.putExtra("author", makalaObjects.get(position).getArticle_author());
intent.putExtra("body", makalaObjects.get(position).getArticle_body());
intent.putExtra("img_url", makalaObjects.get(position).getArticle_img_url());
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);
}
private void getMakala() {
makalaObjects.clear();
// adapter = null;
// activity.llprogress.setVisibility(View.VISIBLE);
db.collection("Articles").get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
if(!queryDocumentSnapshots.isEmpty()){
List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();
for(DocumentSnapshot d : list){
MakalaModel makalaModel = d.toObject(MakalaModel.class);
makalaModel.setMakala_id(d.getId());
makalaModel.setViewType(0);
if(!makalaModel.getMakala_id().equals("0"))
makalaObjects.add(makalaModel);
else{
article_number = makalaModel.getArticle_number();
}
}
// Collections.reverse(makalaObjects);
makalaObjects.sort((schedule1, schedule2)->{
int returnValue = 0;
if(Integer.parseInt(schedule1.getMakala_id()) > Integer.parseInt(schedule2.getMakala_id())) return -1;
else if(Integer.parseInt(schedule1.getMakala_id()) < Integer.parseInt(schedule2.getMakala_id())) return 1;
return returnValue;
});
ArrayList<MakalaModel> scrollList = new ArrayList<>();
for(int i=likedArray.length-1;i>=0;i--){
for(int j=makalaObjects.size()-1;j>=0;j--){
if(likedArray[i].equals(makalaObjects.get(j).getMakala_id())){
scrollList.add(makalaObjects.get(j));
}
}
}
MakalaModel m = new MakalaModel();
m.setListMakalaModel(scrollList);
m.setViewType(1);
makalaObjects.add(3,m);
adapter.notifyDataSetChanged();
// adapter = new MyRecMultiAdapter(activity.getApplicationContext(), makalaObjects);
// recyclerView.setAdapter(adapter);
activity.llprogress.setVisibility(View.GONE);
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(activity, "error", Toast.LENGTH_SHORT).show();
activity.llprogress.setVisibility(View.GONE);
}});
}
@Override
public void onResume() {
super.onResume();
isWifiEnabled();
initScrollView();
adapter.notifyDataSetChanged();
}
public boolean isWifiEnabled(){
ConnectivityManager cm = (ConnectivityManager) activity.getApplicationContext().getSystemService(
Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (wifiNetwork != null && wifiNetwork.isConnected()) {
SharedPreferences.Editor editor = preferences.edit();
editor.putString("wifi_enabled", "1");
editor.commit();
return true;
}
SharedPreferences.Editor editor = preferences.edit();
editor.putString("wifi_enabled", "0");
editor.commit();
return false;
}
}
我的item_list_makala_vertical.xml代码(recyclerview的列表项)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="400dp"
android:paddingVertical="5dp"
android:paddingHorizontal="15dp">
<TextView
android:id="@+id/t_category"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="WHAT TO COOK"
android:textSize="14sp"
android:fontFamily="@font/nunitosans_black"
android:textStyle="bold"
android:textColor="@color/colorBlack"/>
<TextView
android:id="@+id/t_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorBlack"
android:fontFamily="@font/verdana"
android:textSize="18sp"
android:layout_marginTop="5dp"
android:layout_below="@+id/t_category"
android:text="New Recipes for Your Rotation Add vegan tantanment and roasted rhubarb cobbler to your weekend cooking plans."/>
<ImageView
android:id="@+id/i_image"
android:layout_width="match_parent"
android:layout_height="250dp"
android:src="@drawable/mini_map"
android:scaleType="centerCrop"
android:layout_marginTop="7dp"
android:layout_below="@+id/t_title"/>
<RelativeLayout
android:id="@+id/r_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/i_image">
<TextView
android:id="@+id/t_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="27.04.2021"
android:textSize="12sp"
android:fontFamily="@font/nunitosans_light"
android:textStyle="bold"
android:alpha="0.6"
android:layout_marginTop="5dp"
android:textColor="@color/colorBlack"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/t_view"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:src="@drawable/ic_view"/>
<TextView
android:id="@+id/t_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="24"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:textSize="12sp"
android:fontFamily="@font/nunitosans_bold"
android:textStyle="bold"
android:layout_marginTop="5dp"
android:textColor="@color/colorBlack"/>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/colorBlack"
android:layout_below="@+id/r_bottom"
android:layout_marginTop="15dp"/>
</RelativeLayout>
感谢您的帮助...
使用 gilde 加载图像时使用以下代码:
Glide.with(context).load(new URL(url))
.thumbnail(0.5f)
.centerCrop()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(postHolder.i_image);
更好地分页您的新闻数据。