Android 在recyclerView中呈现imageView延迟时出现问题
你好,我现在的应用程序有一个大问题。我有一个recyclerView,我用back4app中的数据填充适配器。我已经和他们核实过了,我的询问没有延迟。无论如何,当我加载呈现回收器视图的片段,该片段具有两行的网格布局模式时,问题如下 这是onCreateViewHolder中膨胀的XML 当我在模拟器或手机上运行应用程序时,我会在屏幕上看到这种行为,几毫秒后图像会正确显示,但这已经转化为一种可怕的用户体验,使其行为缓慢 这是我的片段Android 在recyclerView中呈现imageView延迟时出现问题,android,performance,android-recyclerview,Android,Performance,Android Recyclerview,你好,我现在的应用程序有一个大问题。我有一个recyclerView,我用back4app中的数据填充适配器。我已经和他们核实过了,我的询问没有延迟。无论如何,当我加载呈现回收器视图的片段,该片段具有两行的网格布局模式时,问题如下 这是onCreateViewHolder中膨胀的XML 当我在模拟器或手机上运行应用程序时,我会在屏幕上看到这种行为,几毫秒后图像会正确显示,但这已经转化为一种可怕的用户体验,使其行为缓慢 这是我的片段 public class PropiedadesInmob
public class PropiedadesInmobiliariasFragment extends Fragment {
private LinearLayoutManager layoutManager;
RecyclerView recyclerInmobiliarias;
ParseObject queryEmpresa;
ParseObject empresa;
String stringEmpresa;
List<ParseObject> allItems;
FragmentManager fm;
ProgressBar pb;
public PropiedadesInmobiliariasFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_propiedades_inmobiliarias, container, false);
pb = view.findViewById(R.id.progress_bar_inmo);
recyclerInmobiliarias=(RecyclerView)view.findViewById(R.id.recycler_inmobiliarias);
//pb.setVisibility(View.VISIBLE);
recyclerInmobiliarias.setVisibility(View.GONE);
pb.setVisibility(View.VISIBLE);
allItems=new ArrayList<>();
queryEmpresa();
layoutManager=new GridLayoutManager(getContext(),2);
recyclerInmobiliarias.setLayoutManager(layoutManager);
recyclerInmobiliarias.setHasFixedSize(true);
recyclerInmobiliarias.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerInmobiliarias, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
ParseObject item=allItems.get(position);
String selectedObjectId= item.getObjectId();
String nombrePro=item.getString("NombrePropiedad");
ParseFile object1 = item.getParseFile("imagenPrincipal");
ParseFile imagen1 = item.getParseFile("imagen1");
ParseFile imagen2 = item.getParseFile("imagen2");
ParseFile imagen3 = item.getParseFile("imagen3");
ParseFile imagen4 = item.getParseFile("imagen4");
ParseFile imagen5 = item.getParseFile("imagen5");
ParseFile imagen6 = item.getParseFile("imagen6");
ParseFile imagen7 = item.getParseFile("imagen7");
ParseFile imagen8 = item.getParseFile("imagen8");
String precio=item.getString("Precio");
String numHabita=item.getString("numeroDeHabitaciones");
String metrosCuadrados=item.getString("metrosCuadrados");
String numeroBanos=item.getString("numeroBanos");
String descrip=item.getString("descripcionAdicionalPropiedad");
String admin=item.getString("valorAdministracion");
String numPar=item.getString("Parqueaderos");
Bundle bundle=new Bundle();
bundle.putString("objectId",selectedObjectId);
bundle.putString("Nombre",nombrePro);
bundle.putString("primeraFoto", object1.getUrl());
bundle.putString("precio",precio);
bundle.putString("numHab",numHabita);
bundle.putString("metrosCua",metrosCuadrados);
bundle.putString("numBanos",numeroBanos);
bundle.putString("des",descrip);
bundle.putString("admin",admin);
bundle.putString("parq",numPar);
Intent intent = new Intent(getActivity(), DetalleInmobiliaria.class);
intent.putExtra("objectId", selectedObjectId);
intent.putExtra("Nombre", nombrePro);
intent.putExtra("primeraFoto", object1.getUrl());
intent.putExtra("precio", precio);
intent.putExtra("numHab", numHabita);
intent.putExtra("metrosCua", metrosCuadrados);
intent.putExtra("numBanos", numeroBanos);
intent.putExtra("des", descrip);
intent.putExtra("admin", admin);
intent.putExtra("parq", numPar);
startActivity(intent);
}
@Override
public void onLongClick(View view, int position) {
}
}));
return view;
}
private void queryEmpresa(){
/**Ojo no es que no este sirviendo el metodo sino que el tipo de empresa asignado al usuario
* no concuerda para que llene el recycler*/
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.whereEqualTo("objectId",ParseUser.getCurrentUser().getObjectId());
query.include("Empresa");
query.getInBackground(ParseUser.getCurrentUser().getObjectId(), new GetCallback<ParseUser>() {
public void done(ParseUser object, ParseException e) {
if (e == null) {
// object will be your user and you should be able to retrieve Empresa like this
empresa = object.getParseObject("Empresa");
stringEmpresa=empresa.getObjectId();
queryPropInmo();
} else {
// something went wrong. It would be good to log.
}
}
});
}
private void queryPropInmo(){
ParseQuery<ParseObject> query1 = ParseQuery.getQuery("PropiedadesInmobiliarias");
queryEmpresa=ParseObject.createWithoutData("Empresa",stringEmpresa);
query1.whereEqualTo("Empresa",queryEmpresa);
query1.include("Empresa");
query1.include("Imagenes");
query1.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if(objects!=null) {
for (ParseObject obj : objects
) {
allItems.add(obj);
}
}
InmobiliariaAdapter adapter = new InmobiliariaAdapter(getActivity(),allItems);
recyclerInmobiliarias.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
});
pb.setVisibility(View.GONE);
recyclerInmobiliarias.setVisibility(View.VISIBLE);
}
}
公共类PropiedDesignMobiliasFragment扩展片段{
私人专线经理;布局经理;
RecyclerViewRecyclerineMobiliarias;
ParseObject queryEmpresa;
ParseObject empresa;
弦乐演奏;
列出所有项目;
碎片管理器fm;
ProgressBar-pb;
公共应用程序设计双语片段(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment_propiedades_inmobiliarias,container,false);
pb=view.findViewById(R.id.progress\u bar\u inmo);
recyclerInmobiliarias=(RecyclerView)view.findViewById(R.id.recycler\u inmobiliarias);
//pb.setVisibility(View.VISIBLE);
recyclerinemobiliarias.setVisibility(View.GONE);
pb.setVisibility(View.VISIBLE);
allItems=新的ArrayList();
queryEmpresa();
layoutManager=新的GridLayoutManager(getContext(),2);
RecyclerineMobiliarias.setLayoutManager(layoutManager);
RecyclerineMobiliarias.setHasFixedSize(真);
recyclerInmobiliarias.addOnItemTouchListener(新的RecyclerToucListener(getActivity(),recyclerInmobiliarias,新的RecyclerToucListener.ClickListener()){
@凌驾
公共void onClick(视图,int位置){
ParseObject item=allItems.get(位置);
字符串selectedObjectId=item.getObjectId();
字符串nombrePro=item.getString(“NombrePropiedad”);
ParseFile object1=item.getParseFile(“imagenPrincipal”);
ParseFile imagen1=item.getParseFile(“imagen1”);
ParseFile imagen2=item.getParseFile(“imagen2”);
ParseFile imagen3=item.getParseFile(“imagen3”);
ParseFile imagen4=item.getParseFile(“imagen4”);
ParseFile imagen5=item.getParseFile(“imagen5”);
ParseFile imagen6=item.getParseFile(“imagen6”);
ParseFile imagen7=item.getParseFile(“imagen7”);
ParseFile imagen8=item.getParseFile(“imagen8”);
String precio=item.getString(“precio”);
String numHabita=item.getString(“numodeHabiciones”);
String metrosCuadrados=item.getString(“metrosCuadrados”);
字符串numeroBanos=item.getString(“numeroBanos”);
String descripp=item.getString(“descriptionadivationalPropiedad”);
String admin=item.getString(“valoradministration”);
String numPar=item.getString(“Parqueaderos”);
Bundle=新Bundle();
bundle.putString(“objectId”,selectedObjectId);
bundle.putString(“Nombre”,nombrePro);
bundle.putString(“primeraFoto”,object1.getUrl());
bundle.putString(“precio”,precio);
bundle.putString(“numHab”,numHabita);
bundle.putString(“metrosCua”,Metroscuadradados);
bundle.putString(“numBanos”,numeroBanos);
bundle.putString(“des”,descrip);
bundle.putString(“admin”,admin);
bundle.putString(“parq”,numPar);
Intent Intent=new Intent(getActivity(),DetalleInmobiliaria.class);
intent.putExtra(“objectId”,selectedObjectId);
意向。额外(“Nombre”,nombrePro);
intent.putExtra(“primeraFoto”,object1.getUrl());
意图。额外支付(“precio”,precio);
意图。putExtra(“numHab”,numHabita);
意图。putExtra(“metrosCua”,Metroscuadradados);
意向。额外(“Numanos”,numeroBanos);
意向。额外(“des”,描述);
intent.putExtra(“admin”,admin);
意向书(putExtra)(“parq”,numPar);
星触觉(意向);
}
@凌驾
仅长按公共无效(视图,int位置){
}
}));
返回视图;
}
私有void queryEmpresa(){
/**我不知道你是怎么想的,我知道你是怎么想的
*无纳切尔达垃圾回收站*/
ParseQuery=ParseUser.getQuery();
query.whereEqualTo(“objectId”,ParseUser.getCurrentUser().getObjectId());
查询。包括(“Empresa”);
query.getInBackground(ParseUser.getCurrentUser().getObjectId(),new GetCallback()){
public void done(ParseUser对象,parsee异常){
如果(e==null){
//对象将是您的用户,您应该能够像这样检索Empresa
empresa=object.getParseObject(“empresa”);
stringEmpresa=empresa.getObjectId();
queryPropInmo();
}否则{
//出了点问题。最好记录下来。
}
}
});
}
私有void queryPropInmo(){
ParseQuery query1=ParseQuery.getQuery(“PropiedDesinmobiliarias”);
queryEmpresa=ParseObject.createWithoutData(“Empresa”,
public class InmobiliariaAdapter extends RecyclerView.Adapter<InmobiliariaAdapter.ViewHolder> {
Context context;
List<ParseObject> inmobiliList;
public InmobiliariaAdapter(Context context, List<ParseObject> inmobiliList) {
this.context = context;
this.inmobiliList = inmobiliList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_carros, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
ParseObject item = inmobiliList.get(position);
viewHolder.imagen.post(new Runnable() {
@Override
public void run() {
loadBitmap(item,viewHolder);
}
});
viewHolder.nombrePropInmobi.setText(item.getString("NombrePropiedad"));
}
@Override
public int getItemCount() {
return this.inmobiliList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView imagen;
TextView nombrePropInmobi;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imagen = (ImageView) itemView.findViewById(R.id.imgCarro);
nombrePropInmobi = (TextView) itemView.findViewById(R.id.txttitulo);
}
}
private void loadBitmap(ParseObject item, ViewHolder viewHolder){
ParseFile parseFile = item.getParseFile("imagenPrincipal");
if (parseFile != null) {
parseFile.getDataInBackground(new GetDataCallback() {
@Override
public void done(byte[] data, ParseException e) {
if (e == null) {
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
if (bmp != null) {
viewHolder.imagen.setImageBitmap(bmp);
}
}
}
});
}
}
}
Glide.with(context)
.load("https://raw.githubusercontent.com/bumptech/glide/master/static/glide_logo.png")
.placeholder(R.drawable.circularProgressDrawable)
.into(IMAGE_VIEW)
Glide.with(context)
.load(url)
.error(R.drawable.error)
.placeholder(R.drawable.placeholder)
.priority(Priority.HIGH)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.override(60, 60)
.transition(DrawableTransitionOptions.withCrossFade(AppConstants.CROSS_FADE_DIRATION))
.transform(//based on requirements)
.into(target) // Async load the image
private val target = object : CustomTarget<Drawable>() {
override fun onLoadCleared(placeholder: Drawable?) {
}
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
// OnImage ready set the image with the drawable
}
override fun onLoadFailed(errorDrawable: Drawable?) {
// OnFail set the error drawable to the view
}
}
Glide.with(getContext())
.load(getUrl()// load content)
.error(R.drawable.error)
.placeholder(R.drawable.placeholder)
.priority(Priority.HIGH)
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.override(60, 60)
.transition(DrawableTransitionOptions.withCrossFade(AppConstants.CROSS_FADE_DIRATION))
.transform(//based on requirements)
.into(target) // Async load the image
private CustomTarget<Drawable> target = new CustomTarget<Drawable>() {
@Override
void onLoadCleared(@Nullable Drawable placeholder) {
}
@Override
void onResourceReady(Drawable resource,@Nullable Transition<in Drawable> transistion) {
// OnImage ready set the image with the drawable
}
@Override
void onLoadFailed(@Nullable Drawable errorDrawable ) {
// OnFail set the error drawable to the view
}
}