为什么我的“post”在android recyclerview中以不同的大小加载?

好的,这就是我的recyclerview显示我的“post”的方式。 谁能告诉我为什么? 我也会发布源代码。 我试过改变一些代码没有成功。 此外,当我滚动浏览RecyclerView时,其中一些会调整为更小或更大的尺寸。 任何和所有帮助表示赞赏!

这是我的RecyclerView加载时的样子。此外,当我滚动时,一些调整大小到其他更小或更大的尺寸。

fragment_home.xml:

    

list_item.xml:

                  

LruBitmapCache.java:

 public class LruBitmapCache extends LruCache implements ImageCache { public LruBitmapCache(int maxSize) { super(maxSize); } public LruBitmapCache(Context context) { this(getCacheSize(context)); } @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight(); } @Override public Bitmap getBitmap(String url) { return get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { put(url, bitmap); } public static int getCacheSize(Context context) { final DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); final int screenWidth = displayMetrics.widthPixels; final int screenHeight = displayMetrics.heightPixels; final int screenBytes = screenWidth * screenHeight * 4; return screenBytes * 3; } } 

MyRecyclerAdapter.java:

 public class MyRecyclerAdapter extends RecyclerView.Adapter { private List listItemsList; private Context mContext; private ImageLoader mImageLoader; private int focusedItem = 0; public MyRecyclerAdapter(Context context, List listItemsList) { this.mContext = context; this.listItemsList = listItemsList; } @Override public ListRowViewHolder onCreateViewHolder(final ViewGroup viewGroup, int position) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, null); ListRowViewHolder holder = new ListRowViewHolder(v); return holder; } @Override public void onBindViewHolder(final ListRowViewHolder listRowViewHolder, int position) { ListItems listItems = listItemsList.get(position); listRowViewHolder.itemView.setSelected(focusedItem == position); listRowViewHolder.getLayoutPosition(); mImageLoader = MySingleton.getInstance(mContext).getImageLoader(); listRowViewHolder.thumbnail.setImageUrl(listItems.getProfilePicture(), mImageLoader); listRowViewHolder.thumbnail.setDefaultImageResId(R.drawable.placeholder); listRowViewHolder.image_1.setImageUrl(listItems.getImage_1(), mImageLoader); listRowViewHolder.image_1.setDefaultImageResId(R.drawable.placeholder); listRowViewHolder.username.setText(Html.fromHtml(listItems.getUsername())); } public void clearAdapter() { listItemsList.clear(); notifyDataSetChanged(); } @Override public int getItemCount() { return (null != listItemsList ? listItemsList.size() : 0); } } 

MySingleton.java:

 public class MySingleton { private static MySingleton mInstance; private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static Context mContext; private MySingleton(Context context) { mContext = context; mRequestQueue = getRequestQueue(); mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(LruBitmapCache.getCacheSize(mContext))); } public static synchronized MySingleton getInstance(Context context) { if (mInstance == null) { mInstance = new MySingleton(context); } return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext()); } return mRequestQueue; } public  void addToRequestQueue(Request req) { getRequestQueue().add(req); } public ImageLoader getImageLoader() { return mImageLoader; } } 

ListRowViewHolder.java:

 public class ListRowViewHolder extends RecyclerView.ViewHolder { protected NetworkImageView thumbnail; protected NetworkImageView image_1; protected ImageButton yes; protected ImageButton no; protected TextView username; protected LinearLayout recLayout; public ListRowViewHolder(View view) { super(view); this.thumbnail = (NetworkImageView) view.findViewById(R.id.thumbnail); this.image_1 = (NetworkImageView) view.findViewById(R.id.image_1); this.yes = (ImageButton) view.findViewById(R.id.yesButton); this.no = (ImageButton) view.findViewById(R.id.noButton); this.username = (TextView) view.findViewById(R.id.pUsername); this.recLayout = (LinearLayout) view.findViewById(R.id.listItemLayout); view.setClickable(true); } } 

FragmentHome.java:

 public class FragmentHome extends Fragment { private final String postsUrl = "http://www.example.com/fetch_posts.php"; private ProgressDialog progressDialog; private static final String TAG = "RecyclerViewExample"; private List listItemsList = new ArrayList(); private RecyclerView mRecyclerView; private MyRecyclerAdapter adapter; public FragmentHome() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (container == null) { return null; } View view = inflater.inflate(R.layout.fragment_home, container, false); mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); mRecyclerView.addItemDecoration( new HorizontalDividerItemDecoration.Builder(getActivity()) .color(Color.BLACK) .build()); final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(linearLayoutManager); updateFeed(); return view; } public void updateFeed() { showPD(); adapter = new MyRecyclerAdapter(getActivity(), listItemsList); mRecyclerView.setAdapter(adapter); RequestQueue request = Volley.newRequestQueue(getActivity()); adapter.clearAdapter(); JsonArrayRequest req = new JsonArrayRequest(postsUrl, new Response.Listener() { @Override public void onResponse(JSONArray response) { Log.d(TAG, response.toString()); try { for (int i = 0; i < response.length(); i++) { JSONObject post = (JSONObject) response.get(i); ListItems item = new ListItems(); item.setImage_1(post.getString("image_1")); item.setUsername(post.getString("username")); item.setProfilePicture(post.getString("image_1")); listItemsList.add(item); } } catch (JSONException e) { e.printStackTrace(); Toast.makeText(getActivity(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } adapter.notifyDataSetChanged(); hidePD(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); hidePD(); Toast.makeText(getActivity(), "Volley Error: " + error.getMessage(), Toast.LENGTH_LONG).show(); } }); request.add(req); } private void showPD() { if (progressDialog == null) { progressDialog = new ProgressDialog(getActivity()); progressDialog.setMessage("Loading..."); progressDialog.setCancelable(false); progressDialog.setCanceledOnTouchOutside(false); progressDialog.show(); } } private void hidePD() { if (progressDialog != null) { progressDialog.dismiss(); progressDialog = null; } } @Override public void onDestroy() { super.onDestroy(); hidePD(); } } 

你没有在onCreateViewHolder()正确地膨胀你的View而不是

 View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, null); 

你应该使用

 View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, viewGroup, false); 

有关不同LayoutInflater.inflate()方法的更多详细信息,请参阅此答案 。

关于“ 另外,当我滚动我的RecyclerView时,其中一些调整为更小或更大的尺寸。
正如名称“Recycler”,它重用了ViewHolder对象。 当您向下/向上滚动并且当视图(支架)离开屏幕时,视图对象不会被破坏,但它将被再次使用(再循环)以保持/表示另一个变得可见的数据集。

如果在可见的新位置设置的数据没有数据(可能为空或空等),在您的情况下为profile_pic / thumbnail,RecyclerView将使用用于表示此位置的回收持有者的数据。 这就是为什么当你有多个数据集而不是屏幕可以容纳时,当你向上/向下滚动时,你会看到每次滚动视图(使其可见和不可见),它将显示不同的数据,具体取决于(回收)持有者它目前使用。 如果您的个人资料照片不同于每个视图的猫照片,那么您可以清楚地看到这种效果。

您要做的是在将数据(图像,文本等)设置为视图之前,您可以先将其重置为最佳。 如果是图像,您可以按照建议https://stackoverflow.com/a/8243184/3209739清除/重置。 或者您可以拥有占位符图像或使其透明。 那么这个问题不应该发生。
我认为出于同样的原因,它显示了不同大小的图像(拇指和轮廓图片)。

尝试在设置实际数据之前重置视图。 使用RecyclerView时,最好还是遵循这一点。

为什么要拥有自己的缓存代码? 为什么不能使用Picasso图像加载器,Universal Image Loader或适合您需求的东西。 看看这里了解不同的图像装载机Picasso v / s Imageloader v / s Fresco vs Glide 。