gpt4 book ai didi

android - RecyclerView 中的图像不会在启动时出现

转载 作者:行者123 更新时间:2023-11-29 02:39:30 26 4
gpt4 key购买 nike

我有一个 RecyclerView,里面有一张卡片列表,每张卡片都有一个位置可以放一张图片。当我最初向下滚动时,从屏幕外开始的卡片一旦出现在屏幕上就会加载它们的图像,但是在屏幕上开始的卡片只有在它们离开屏幕并返回屏幕后才会加载它们的图像。

它似乎也有点随机。上下文的 GIF:https://gfycat.com/gifs/detail/accurateeducatedbaiji

gif 中的最后一个示例(前 3 个餐厅图片未加载)是最常见的。

ViewHolder:

public class LocationsViewHolder extends RecyclerView.ViewHolder{

private ImageView locationImage;
private TextView locationName;
private TextView locationAddress;

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

locationName = (TextView)itemView.findViewById(R.id.location_name);
locationAddress = (TextView)itemView.findViewById(R.id.location_address);
locationImage = (ImageView) itemView.findViewById(R.id.location_image);
}

public void updateUI(Place place){
locationName.setText(place.getName());
if(place.getPhotoID() != null){
// Log.v("IMAGE", "photoID for " + place.getName() + ": " + place.getPhotoID());
locationImage.setImageBitmap(place.getImage());
} else {
locationImage.setImageResource(R.drawable.no_image);
}
}

}

适配器:

public class LocationsAdapter extends RecyclerView.Adapter<LocationsViewHolder>{

ArrayList<Place> locations;

Context context;

GetNearbyPlacesData data;

public LocationsAdapter(ArrayList<Place> locations, Context context) {
this.locations = locations;
this.context = context;
data = GetNearbyPlacesData.getInstance(context);
}

@Override
public LocationsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View card = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_location, parent, false);
return new LocationsViewHolder(card);
}

@Override
public void onBindViewHolder(LocationsViewHolder holder, int position) {
Place location = locations.get(position);
holder.updateUI(location);
}

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

}

下载地点图片:

    Bitmap bitmap;

public void downloadPlaceImage(String imageKey, final Place place){
String url = buildImgURL(imageKey);

ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
bitmap = response;
place.setImage(bitmap);
Log.v("IMG", "downloaded image");
}
}, 0, 0, null, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});

requestQueue.add(imageRequest);
}
}

如何在餐厅和药店之间切换:onNavigationItemSelected 监听器:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Log.v("NAV", "Navigation item selected");
URLInfo = new Bundle();
URLInfo.putString("radius", MAP_RADIUS);
URLInfo.putString("location", userMarker.getPosition().latitude + "," + userMarker.getPosition().longitude);

mMap.clear();
switch (item.getItemId()){
case R.id.nav_restaurant: {
URLInfo.putString("type", "restaurant");
placeList = data.downloadPlacesData(URLInfo);
break;
}
case R.id.nav_pharmacy: {
URLInfo.putString("type", "pharmacy");
placeList = data.downloadPlacesData(URLInfo);
break;
}
case R.id.nav_bank: {
URLInfo.putString("type", "bank");
placeList = data.downloadPlacesData(URLInfo);
break;
}
}

mDrawerLayout.closeDrawer(GravityCompat.START);
return true;
}

downloadPlacesData() 函数:

ArrayList<Place> placesList;

public ArrayList<Place> downloadPlacesData(Bundle bundle){
String url = buildPlaceURL(bundle);

placesList = new ArrayList<>();

//TODO make more requests for the next pages of results since each page is limited to 20 places

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray results = response.getJSONArray("results");
for(int i = 0; i < results.length(); i++){
JSONObject main = results.getJSONObject(i);
JSONObject geo = main.getJSONObject("geometry");
JSONObject loc = geo.getJSONObject("location");
String placeID = main.getString("place_id");
String name = main.getString("name");
String lat = loc.getString("lat");
String lng = loc.getString("lng");
String photoID = null;

try {
if (main.getJSONArray("photos") != null) {
JSONArray photos = main.getJSONArray("photos");
photoID = photos.getJSONObject(0).getString("photo_reference");
}
}catch (JSONException e){
Log.v("JSON4", e.getLocalizedMessage());
}

Place place = new Place(photoID, name, placeID, Double.parseDouble(lat), Double.parseDouble(lng), context);
Log.v("NAME", name);

placesList.add(place);

}
onPlacesLoadedListener.placesLoaded(placesList);

}catch (JSONException e){
Log.v("JSON", e.getLocalizedMessage());
}

}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});

requestQueue.add(jsonObjectRequest);

return placesList;
}

placesLoaded 回调和创建 LocationsListFragment:

@Override
public void placesLoaded(ArrayList<Place> list) {
Log.v("PLACES", "adding places");
MarkerOptions markerOptions = new MarkerOptions();

// build a resource path using the type of place
String type = URLInfo.getString("type");
String resourcePath = "drawable/pin_" + type;

// create a resource path out of the String created
int resource = getResources().getIdentifier(resourcePath, null, this.getPackageName());

// set the marker icon according to the place type
markerOptions.icon(BitmapDescriptorFactory.fromResource(resource));

for(int i = 0; i < list.size(); i++){
// get the latitude and longitude
double lat = list.get(i).getLat();
double lng = list.get(i).getLng();
// set the marker position and title
markerOptions.position(new LatLng(lat, lng));
markerOptions.title(list.get(i).getName());
mMap.addMarker(markerOptions);
}
createLocationsListFragment();

}

private void createLocationsListFragment() {
FragmentManager fm = getSupportFragmentManager();
LocationsListFragment fragment = LocationsListFragment.newInstance();
fm.beginTransaction().add(R.id.container_locations, fragment).commit();
}

最后是实际 fragment (onCreate 和 onCreateView):

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

getLocationsData = (GetLocationsData) getContext();
mParam1 = getLocationsData.getList();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_locations_list, container, false);
adapter = new LocationsAdapter(mParam1, getContext());

RecyclerView recyclerView = (RecyclerView)v.findViewById(R.id.recycler_locations);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);

LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);

return v;
}

最佳答案

如果你有图像的 url 或位图,那么使用 glide,因为它会缓存你的图像,如果你发送 url 并加载它,则进行网络调用 for more about glide

Glide.with(mContext)
.load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.centerCrop()
.into(mImageView_photo)
;

关于android - RecyclerView 中的图像不会在启动时出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45226536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com