java - RecyclerView 从活动返回后滚动缓慢
问题描述
我有一个带有 CardViews 的 RecyclerView 的活动。此 recyclerView 由服务响应填充。我第一次进入活动时,recyclerView 正常上下滚动,速度正常。如果我点击其中一个 cardView,就会有一个意图转到此卡的活动详细信息。如果我回到recyclerView(通过点击后退按钮),recyclerView的向下和向上滚动更慢,如果我再次进入细节,然后回来,滚动比上次慢等等.
这是适配器代码:
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {
private FirebaseFirestore db;
private Context mContext;
private ArrayList<Cupon> mList;
private CountryUser cu;
public CardAdapter(Context context, ArrayList<Cupon> list, FirebaseFirestore db, CountryUser cu) {
this.mContext = context;
this.mList = list;
this.db = db;
this.cu = cu;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.rv_card_items, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
viewHolder.bind(mList.get(i));
}
@Override
public int getItemCount() {
return mList.size();
}
@Override
public long getItemId(int position) {
return mList.get(position).hashCode(); //id()
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView titulo;
private TextView subtitulo;
private TextView precioReal;
private TextView precioDesc;
private ImageView imagen;
private ImageView imgComercio;
private ImageButton fav;
private CardView cardView;
private ViewHolder(View itemView) {
super(itemView);
titulo = itemView.findViewById(R.id.txt_titulo);
subtitulo = itemView.findViewById(R.id.txt_subtitulo);
precioReal = itemView.findViewById(R.id.txt_precioReal);
precioDesc = itemView.findViewById(R.id.txt_precioDesc);
imagen = itemView.findViewById(R.id.imageview_imagenCupon);
imgComercio = itemView.findViewById(R.id.img_comercio);
cardView = itemView.findViewById(R.id.card_view);
fav = itemView.findViewById(R.id.fav);
}
private void bind(Cupon cardItem){
favorite(Objects.requireNonNull(cardItem.getIdCategoria()));
titulo.setText(cardItem.getTitulo());
subtitulo.setText(cardItem.getSubtitulo());
precioReal.setText(cardItem.getPrecioReal());
precioDesc.setText(cardItem.getPrecioDesc());
if (imagen != null) {
Picasso.get()
.load(cardItem.getImagenCupon())
.fit()
.centerCrop()
.error(R.drawable.notfound)
.into(imagen);
}
if (imgComercio != null){
Picasso.get()
.load(cardItem.getImagenComercio())
.fit()
.centerInside()
.error(R.drawable.notfound)
.into(imgComercio);
}
fav.setOnClickListener(v -> {
Animation animScale = AnimationUtils.loadAnimation(mContext, R.anim.scale_fav);
v.startAnimation(animScale);
addFav(cardItem.getIdCategoria());
});
cardView.setOnClickListener(v -> mContext.startActivity(DetalleCuponActivity.getIntent(mContext, cardItem.getIdCategoria(), "0")));
}
private void favorite(String id) {
String favorito = "0";
db.collection("Favorito")
.whereEqualTo("idUsuario", Fn.Companion.getUserUID())
.whereEqualTo("idCupon", id)
.whereEqualTo("estado", favorito)
.get()
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
if (Objects.requireNonNull(task.getResult()).isEmpty()) {
fav.setBackgroundResource(R.drawable.ic_favorito);
} else {
Animation animScale = AnimationUtils.loadAnimation(mContext, R.anim.scale_fav);
fav.startAnimation(animScale);
fav.setBackgroundResource(R.drawable.ic_corazon);
}
} else Log.d("ERROR", "Error getting documents: ", task.getException());
});
}
private void addFav(final String id) {
String favorito = "0";
db.collection("Favorito")
.whereEqualTo("idUsuario", Fn.Companion.getUserUID())
.whereEqualTo("idCupon", id)
.whereEqualTo("estado", favorito)
.get()
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
if (Objects.requireNonNull(task.getResult()).isEmpty()) {
fav.setBackgroundResource(R.drawable.ic_corazon);
String pais = cu.getAbr();
Map<String, Object> newFav = new HashMap<>();
newFav.put("idUsuario", Fn.Companion.getUserUID());
newFav.put("idCupon", id);
newFav.put("fecha", new Date(System.currentTimeMillis()));
newFav.put("estado", "0");
newFav.put("tipo", "c");
newFav.put("pais", pais);
db.collection("Favorito")
.add(newFav)
.addOnFailureListener(e -> fav.setBackgroundResource(R.drawable.ic_favorito));
} else {
fav.setBackgroundResource(R.drawable.ic_favorito);
for (QueryDocumentSnapshot document : task.getResult()) {
DocumentReference ref = db.collection("Favorito").document(document.getId());
ref.update("estado", "1")
.addOnFailureListener(e -> fav.setBackgroundResource(R.drawable.ic_corazon));
}
}
} else Log.d("ERROR", "Error getting documents: ", task.getException());
});
}
}
@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
RoomDataBase.destroyInstance();
mContext = null;
cu = null;
}
public void setFilter(ArrayList<Cupon> newCupon) {
mList = new ArrayList<>();
mList.addAll(newCupon);
notifyDataSetChanged();
}
}
这就是我设置 recyclerView 的方式:
PreCachingLayoutManagerHelper rvLiLayoutManager = new PreCachingLayoutManagerHelper(this);
rvLiLayoutManager.setOrientation(androidx.recyclerview.widget.LinearLayoutManager.VERTICAL);
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
rvLiLayoutManager.setExtraLayoutSpace(metrics.heightPixels * 3);
recyclerView.setLayoutManager(rvLiLayoutManager);
cardAdapter = new CardAdapter(mContext, cardList, FirebaseFirestore.getInstance(),Fn.Companion.getUserSession());
recyclerView.setAdapter(cardAdapter);
这是视图: BusquedaActivity
非常感谢你的帮助。
编辑:这是整个活动代码。
public class BusquedaActivity extends BaseActivity implements CardAdapter.CardAdapterCallback {
public final static String OPCIONID = "opcionid";
public final static String CATEGORYNAME = "categoryiname";
private SwipeRefreshLayout swipeRefreshLayout;
private Dialog dialog;
private LinearLayout emptytId;
private RecyclerView recyclerView;
private ArrayList<Cupon> cardList;
private ArrayList<VipCoupon> dataList;
private CardAdapter cardAdapter;
private VipCouponAdapter vipCouponAdapter;
private CardView commerceCoupon;
private CardView vipCoupon;
private final boolean fav = false;
// Modification Custom Search Adapter
private SearchView searchView;
private CustomSearchAdapter mAdapter;
private TextView generalCardText;
private TextView vipCardText;
private boolean activeVIP = false;
public static Intent getIntent(Context context, String opcion, String name) {
return new Intent(context, BusquedaActivity.class)
.putExtra(OPCIONID, opcion)
.putExtra(CATEGORYNAME, name);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_busqueda);
// Toolbar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
// Views
swipeRefreshLayout = findViewById(R.id.swipe);
commerceCoupon = findViewById(R.id.commerceCoupon);
vipCoupon = findViewById(R.id.vipCoupon);
generalCardText = findViewById(R.id.general);
vipCardText = findViewById(R.id.vip);
emptytId = findViewById(R.id.emptytId);
dialog = new Dialog(BusquedaActivity.this);
dialog.setContentView(R.layout.custom_loader);
recyclerView = findViewById(R.id.rv);
// RecyclerView
recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(true);
recyclerView.setItemViewCacheSize(Global.PAGE_SIZE * 2);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
PreCachingLayoutManagerHelper rvLiLayoutManager = new PreCachingLayoutManagerHelper(this);
rvLiLayoutManager.setOrientation(androidx.recyclerview.widget.LinearLayoutManager.VERTICAL);
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
rvLiLayoutManager.setExtraLayoutSpace(metrics.heightPixels * 3);
recyclerView.setLayoutManager(rvLiLayoutManager);
// Adapter
cardList = new ArrayList<>();
dataList = new ArrayList<>();
cardAdapter = new CardAdapter(this, cardList, FirebaseFirestore.getInstance(), this);
cardAdapter.setHasStableIds(true);
vipCouponAdapter = new VipCouponAdapter(this, dataList);
vipCouponAdapter.setHasStableIds(true);
TextView titulo = findViewById(R.id.toolbar_title);
titulo.setText(Objects.requireNonNull(getIntent().getExtras()).getString(CATEGORYNAME));
Objects.requireNonNull(dialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.setCancelable(true);
dialog.show();
dialog.setOnCancelListener(dialog -> {
finish();
dialog.dismiss();
});
swipeRefreshLayout.setOnRefreshListener(() -> {
if (activeVIP) {
emptytId.setVisibility(View.GONE);
commerceCoupon.setEnabled(true);
vipCoupon.setEnabled(false);
generalCardText.setBackgroundColor(getResources().getColor(R.color.loader));
vipCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
recyclerView.setAdapter(vipCouponAdapter);
cardList.clear();
dataList.clear();
if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
aprovechaYaVIP();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
loNuevoVIP();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
mejoresDescuentosVIP();
}
} else {
emptytId.setVisibility(View.GONE);
commerceCoupon.setEnabled(false);
vipCoupon.setEnabled(true);
generalCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
vipCardText.setBackgroundColor(getResources().getColor(R.color.loader));
recyclerView.setAdapter(cardAdapter);
cardList.clear();
dataList.clear();
if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
aprovechaYa();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
loNuevo();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
mejoresDescuentos();
}
}
});
commerceCoupon.setOnClickListener(view -> {
activeVIP = false;
emptytId.setVisibility(View.GONE);
commerceCoupon.setEnabled(false);
vipCoupon.setEnabled(true);
generalCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
vipCardText.setBackgroundColor(getResources().getColor(R.color.loader));
recyclerView.setAdapter(cardAdapter);
cardList.clear();
dataList.clear();
if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
aprovechaYa();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
loNuevo();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
mejoresDescuentos();
}
});
vipCoupon.setOnClickListener(view -> {
activeVIP = true;
emptytId.setVisibility(View.GONE);
commerceCoupon.setEnabled(true);
vipCoupon.setEnabled(false);
generalCardText.setBackgroundColor(getResources().getColor(R.color.loader));
vipCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
recyclerView.setAdapter(vipCouponAdapter);
cardList.clear();
dataList.clear();
if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
aprovechaYaVIP();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
loNuevoVIP();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
mejoresDescuentosVIP();
}
});
mAdapter = new CustomSearchAdapter(this, null);
// Show Data
initData();
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
this.finish();
return super.onSupportNavigateUp();
}
@Override
protected void onDestroy() {
recyclerView.setAdapter(null);
searchView = null;
super.onDestroy();
}
private void initData() {
activeVIP = false;
emptytId.setVisibility(View.GONE);
commerceCoupon.setEnabled(false);
vipCoupon.setEnabled(true);
generalCardText.setBackgroundColor(getResources().getColor(R.color.colorPrimaryLigth));
vipCardText.setBackgroundColor(getResources().getColor(R.color.loader));
cardList.clear();
dataList.clear();
if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "2")) {
aprovechaYa();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "3")) {
loNuevo();
} else if (Objects.equals(Objects.requireNonNull(getIntent().getExtras()).getString(OPCIONID), "4")) {
mejoresDescuentos();
}
}
private void mejoresDescuentos() {
Call<ArrayList<Cupon>> mejor = getRetrofit().create(Api.class).getMejores(Fn.Companion.getUserCountry());
mejor.enqueue(new Callback<ArrayList<Cupon>>() {
@Override
public void onResponse(@NonNull Call<ArrayList<Cupon>> call, @NonNull Response<ArrayList<Cupon>> response) {
if (response.code() == 200) {
ArrayList<Cupon> ap = response.body();
if (Objects.requireNonNull(ap).isEmpty()) {
showEmptyLayout(true);
dialog.dismiss();
swipeRefreshLayout.setRefreshing(false);
} else {
showEmptyLayout(false);
DecimalFormat format = new DecimalFormat("###,###.00");
String m = Fn.Companion.getUserSession().getMoneda();
for (Cupon c : Objects.requireNonNull(ap)) {
String realPrice = "null";
String descPrice = "null";
String descuentoCode;
if (c.getFbCodeType() == null || c.getFbCodeType().equals("")) {
descuentoCode = "1";
} else {
descuentoCode = c.getFbCodeType();
}
if (descuentoCode == null || descuentoCode.equals("") || descuentoCode.equals("1")) {
double real = Double.parseDouble(c.getPrecioReal());
realPrice = String.valueOf(Html.fromHtml("<strike>" + m + " " + format.format(real) + "</strike>"));
double descuento = Double.parseDouble(c.getPrecioDesc());
descPrice = m + " " + format.format(descuento);
} else if (descuentoCode.equals("2")) {
realPrice = "";
double descuento = Double.parseDouble(c.getPrecioDesc());
descPrice = format.format(descuento) + " %";
} else if (descuentoCode.equals("3")) {
realPrice = "";
double descuento = Double.parseDouble(c.getPrecioDesc());
descPrice = m + " " + format.format(descuento);
}
cardList.add(new Cupon(c.getIdCategoria(), c.getTitulo(), c.getSubtitulo(), descPrice, realPrice, c.getDescripcion(), c.getTyc(), c.getCantCanje(), c.getCantCanjeUSER(), c.getFechaInicio(), c.getFechaFin(), c.getImagenCupon(), c.getImagenComercio(), c.getNombreComercio(), c.getIdComercio(), c.getWhatsapp(), c.getInstagram(), c.getFacebook(), c.getPais(), descuentoCode,fav));
}
cardAdapter.notifyDataSetChanged();
dialog.dismiss();
swipeRefreshLayout.setRefreshing(false);
}
} else {
showEmptyLayout(true);
dialog.dismiss();
swipeRefreshLayout.setRefreshing(false);
}
}
@Override
public void onFailure(@NonNull Call<ArrayList<Cupon>> call, @NonNull Throwable t) {
Fn.Companion.showError(BusquedaActivity.this, getString(R.string.error_connection));
showEmptyLayout(true);
dialog.dismiss();
swipeRefreshLayout.setRefreshing(false);
}
});
}
解决方案
Picasso.get()
.load(url)
.error(R.drawable.mini_map)
.placeholder(R.drawable.mini_map)
.centerInside()
.resize(400,200)
.into(postHolder.i_image);
解决了这个问题。尝试使用 Glide 渲染大尺寸图像时会出现此问题。
推荐阅读
- python - Opencv命名图像捕获
- java - recyclerview.scrollToPosition(adapterarray.size()-1) 导致项目以相反的顺序出现
- arrays - 我需要在谷歌表格中的第一个单词之后添加一个单词
- c# - 为什么在执行 async/await 以添加实体时,Entity Framework 似乎总是处置
- ios - 没有这样的模块“GoogleMobileAds”
- javascript - 如何使此导航栏徽标具有响应性?
- python - 我如何解决这个麻省理工学院的问题来找到买房子所需的月份
- c++ - 如何修复导致嵌入式类/结构出现此错误的函数定义:无法推断“T”的模板参数?
- javascript - 已设置照片后单击上传时将图像重置为空
- dll - 如何动态调用共享库中的函数?