首页 > 解决方案 > 如何在 recyclerview 中加载图像而不影响 imageview 中定义的大小?

问题描述

我正在使用一个 Web 服务,我正在使用改造从中获取图像。我在 imageView 中显示这些图像并使用 recyclerview 加载多个图像。
这是我的布局文件:

<?xml version="1.0" encoding="utf-8"?>    
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/planscontainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
     <android.support.v7.widget.Toolbar
        android:id="@+id/subscplans"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="1dp"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
         <Button
            android:id="@+id/backplans"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_marginLeft="50dp"
            android:background="@drawable/leftarrow" />
         <ImageView
            android:id="@+id/appiconhere"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginStart="400dp"
            android:src="@drawable/moremovelogo" />
     </android.support.v7.widget.Toolbar>
     <TextView
        android:id="@+id/planname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="25dp"
        android:layout_marginTop="41dp"
        android:layout_marginEnd="319dp"
        android:text="Plan Id:"
        app:layout_constraintEnd_toStartOf="@+id/textView3"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/subscplans" />   
     <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="324dp"
        android:layout_marginTop="41dp"
        android:layout_marginBottom="28dp"
        android:text="1"
        app:layout_constraintBottom_toTopOf="@+id/textView11"
        app:layout_constraintStart_toEndOf="@+id/planname"
        app:layout_constraintTop_toBottomOf="@+id/subscplans"
        app:layout_constraintVertical_bias="0.0" /> 
     <TextView
        android:id="@+id/duration"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="25dp"
        android:layout_marginTop="28dp"
        android:text="Plan Name:"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/planname" />
     <TextView
        android:id="@+id/price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="25dp"
        android:layout_marginTop="20dp"
        android:text="Price:"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/duration" /> 
     <TextView
        android:id="@+id/noofmoviesdownload"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="25dp"
        android:layout_marginTop="18dp"
        android:layout_marginEnd="191dp"
        android:text="No. of movies can be download:"
        app:layout_constraintEnd_toStartOf="@+id/textView13"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/price" /> 
     <TextView
        android:id="@+id/canbeviewed"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="24dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="213dp"
        android:text="No. of movies can be viewed"
        app:layout_constraintEnd_toStartOf="@+id/textView14"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/noofmoviesdownload" />    
     <TextView
        android:id="@+id/samemovieviewed"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="25dp"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="143dp"
        android:text="No. of times same movie can be viewed"
        app:layout_constraintEnd_toStartOf="@+id/textView15"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/canbeviewed" />    
     <TextView
        android:id="@+id/timesdownload"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="25dp"
        android:layout_marginTop="17dp"
        android:layout_marginEnd="126dp"
        android:text="No. of times same movie can be download"
        app:layout_constraintEnd_toStartOf="@+id/textView16"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/samemovieviewed" />   
     <TextView
        android:id="@+id/rentpe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="26dp"
        android:layout_marginTop="18dp"
        android:layout_marginEnd="119dp"
        android:text="No. of times same movie can be get on rent"
        app:layout_constraintEnd_toStartOf="@+id/textView17"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/timesdownload" />    
     <TextView
        android:id="@+id/textView11"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="310dp"
        android:layout_marginTop="28dp"
        android:text="TextView"
        app:layout_constraintStart_toEndOf="@+id/duration"
        app:layout_constraintTop_toBottomOf="@+id/textView3" />
     <TextView
        android:id="@+id/textView13"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="362dp"
        android:layout_marginTop="19dp"
        android:text="TextView"
        app:layout_constraintStart_toEndOf="@+id/price"
        app:layout_constraintTop_toBottomOf="@+id/textView11" />    
     <TextView
        android:id="@+id/textView14"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="194dp"
        android:layout_marginTop="19dp"
        android:text="TextView"
        app:layout_constraintStart_toEndOf="@+id/noofmoviesdownload"
        app:layout_constraintTop_toBottomOf="@+id/textView13" />   
     <TextView
        android:id="@+id/textView15"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="216dp"
        android:layout_marginTop="15dp"
        android:layout_marginEnd="480dp"
        android:text="TextView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/canbeviewed"
        app:layout_constraintTop_toBottomOf="@+id/textView14" />   
     <TextView
        android:id="@+id/textView16"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="146dp"
        android:layout_marginTop="25dp"
        android:text="TextView"
        app:layout_constraintStart_toEndOf="@+id/samemovieviewed"
        app:layout_constraintTop_toBottomOf="@+id/textView15" />    
     <TextView
        android:id="@+id/textView17"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="130dp"
        android:layout_marginTop="16dp"
        android:text="TextView"
        app:layout_constraintStart_toEndOf="@+id/timesdownload"
        app:layout_constraintTop_toBottomOf="@+id/textView16" />        
     <Button
        android:id="@+id/buyplan"
        android:layout_width="194dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="227dp"
        android:layout_marginTop="106dp"
        android:layout_marginEnd="59dp"
        android:background="@color/tw__composer_blue"
        android:text="Buy Plan"
        android:textColor="@color/white"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/textView13"
        app:layout_constraintTop_toBottomOf="@+id/subscplans" />    
     <Button
        android:id="@+id/showplans"
        android:layout_width="194dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="224dp"
        android:layout_marginTop="37dp"
        android:layout_marginEnd="62dp"
        android:layout_marginBottom="229dp"
        android:background="#d156b8"
        android:text="Show plans"
        android:textColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/textView15"
        app:layout_constraintTop_toBottomOf="@+id/buyplan"
        app:layout_constraintVertical_bias="0.0" />  
     <TextView
        android:id="@+id/textView19"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="121dp"
        android:layout_marginTop="19dp"
        android:text="TextView"
        app:layout_constraintStart_toEndOf="@+id/rentpe"
        app:layout_constraintTop_toBottomOf="@+id/textView17" />
      <RelativeLayout
        android:id="@+id/linearlayoutimage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/textView19">  
         <android.support.v7.widget.RecyclerView
            android:id="@+id/myrecyclerview"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
         </android.support.v7.widget.RecyclerView>
     </RelativeLayout>
     <Button
        android:id="@+id/cancelplan"
        android:layout_width="194dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="221dp"
        android:layout_marginTop="37dp"
        android:layout_marginEnd="60dp"
        android:background="@color/tw__composer_deep_gray"
        android:text="cancel plan"
        android:textColor="@color/white"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/textView17"
        app:layout_constraintTop_toBottomOf="@+id/showplans" /> 
</android.support.constraint.ConstraintLayout>

对于我拥有的物品:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"   
  >  
    <ImageView
        android:id="@+id/imagethumb"
        android:layout_width="180dp"
        android:layout_height="200dp"
        android:scaleType="fitEnd"/>    
    <TextView
        android:id="@+id/nothing"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />   
</LinearLayout>

我的适配器类看起来像:这是我的适配器类名称ImageAdapter.java

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.SubsImageHolder> {

    DisplayImageOptions options = new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.newlogo)
            .showImageForEmptyUri(R.drawable.newlogo)
            .showImageOnFail(R.drawable.newlogo)
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .considerExifParams(true)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .build();

    private Context context;
    private List<ThumbPojo> imageList;

    public ImageAdapter(Context context, List<ThumbPojo> items) {
        this.context = context;
        this.imageList = items;
    }

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    public List<ThumbPojo> getImageList() {
        return imageList;
    }

    public void setImageList(List<ThumbPojo> imageList) {
        this.imageList = imageList;
    }

    @NonNull
    @Override
    public SubsImageHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater layoutInflater = LayoutInflater.from(context);
        View view = layoutInflater.inflate(R.layout.subscriptionimages, viewGroup, false);
        return new SubsImageHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull SubsImageHolder subsImageHolder, int i) {
       ThumbPojo item = imageList.get(i);
        subsImageHolder.textView.setText(item.getMovieName());
        subsImageHolder.imageView.setImageDrawable(null);
        subsImageHolder.imageView.layout(0,0,0,0);

        ImageLoader.getInstance().displayImage(item.getThumbnail(),subsImageHolder.imageView,options);

//        Glide.with(context)
//                .load(item.getThumbnail())
//                .into(subsImageHolder.imageView);

    }

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

     class SubsImageHolder extends RecyclerView.ViewHolder {

        ImageView imageView;
        TextView textView;

        public SubsImageHolder(@NonNull View itemView) {

            super(itemView);
            imageView = itemView.findViewById(R.id.imagethumb);
            textView = itemView.findViewById(R.id.nothing);
        }
    }
}

我设置 adpater 的主要活动是: SubscriptionPlans.java:

 public class SubscriptionPlans extends AppCompatActivity {

    TextView planid, planname, planprice, noofmoviedownload, noofmovieviewed, sameviewed, samedownload, rentit, nomovi;
    Intent intent = getIntent();
    ImageView imageView3, imageView4;
    String one, two, three, four, five, six, seven, eight;
    List<ThumbPojo> list;
    Button button;
    Button show, buy, cancel;
    int position;
    String allvalues;
    RelativeLayout linearLayout;
    String id;
    int userid, usertype;
    int po;
    String ress;
    public String subs;

    List<CheckActiveOrNot> list1;

    RecyclerView recyclerView;
    ImageAdapter imageAdapter;
    List<ThumbPojo> imageList; 
    List<String> images = new ArrayList<>();
    AVLoadingIndicatorView progressBar;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.premiumsubscriptionplans);
//        progressBar=findViewById(R.id.progressBar);
//        showProgressDialog();

       * recyclerView = findViewById(R.id.myrecyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));*

        userid = SharedPrefsHelper.getUserId(SharedPrefsHelper.USER_ID, 0);
        usertype = SharedPrefsHelper.getUserType(SharedPrefsHelper.USER_TYPE, 0);



        linearLayout = findViewById(R.id.linearlayoutimage);

        //  imageView4 = findViewById(R.id.imageView4);
        planid = findViewById(R.id.textView3);
        planname = findViewById(R.id.textView11);
        planprice = findViewById(R.id.textView13);
        noofmoviedownload = findViewById(R.id.textView14);
        noofmovieviewed = findViewById(R.id.textView15);
        sameviewed = findViewById(R.id.textView16);
        samedownload = findViewById(R.id.textView17);
        rentit = findViewById(R.id.textView19);
        TextView notshow = findViewById(R.id.planname);
        notshow.setVisibility(View.GONE);
        planid.setVisibility(View.GONE);

        button = findViewById(R.id.backplans);
        show = findViewById(R.id.showplans);
        buy = findViewById(R.id.buyplan);
        cancel = findViewById(R.id.cancelplan);


        id = getIntent().getStringExtra("planid");
        imageList = new ArrayList<>();

        Call<List<ThumbPojo>> caller = ApiClient.getInstance().getApiService().getThumbimages(id);
        caller.enqueue(new Callback<List<ThumbPojo>>() {
            @Override
            public void onResponse(Call<List<ThumbPojo>> call, Response<List<ThumbPojo>> response) {
                list =response.body();

//                JSONArray jsonArray=new JSONArray(list);
//                for(int i=0;i<jsonArray.length();i++)
//                {
//                    try {
//                        JSONObject jsonObject=jsonArray.getJSONObject(i);
//                        String name=jsonObject.getString("movieName");
//                        String imageurl=jsonObject.getString("thumbnail");
//
//                        ThumbPojo thumbPojo=new ThumbPojo(name,imageurl);
//                        imageList.add(thumbPojo);
//                    } catch (JSONException e) {
//                        e.printStackTrace();
//                    }
//
//                }

                *imageAdapter=new ImageAdapter(SubscriptionPlans.this,list);
                recyclerView.setHasFixedSize(true);
                recyclerView.setAdapter(imageAdapter);
//                dismissProgressDialog();*

//                if (list.get(position).getThumbnail() != null) {
//                    ImageLoader.getInstance().displayImage(list.get(position).getThumbnail(), imageView3, options);
//                    // ImageLoader.getInstance().displayImage(list.get(position).getThumbnail(),imageView4,options);
//                } else {
//                    nomovi.setText("No movies under this plan");
//                }


            }


            @Override
            public void onFailure(Call<List<ThumbPojo>> call, Throwable t) {
                t.getMessage();
            }
        });

出于图像加载的目的,我正在使用通用图像加载器。现在遇到问题,当单个图像来自服务器时,它会根据 imageview 中提到的宽度和高度加载。但是当两个或更多图像的大小不同时。

图像看起来像这样

我已经尝试了几乎所有来自互联网的解决方案,但没有任何效果。我还将布局设置为 (0,0,0,0) 但这也无法解决此问题。

图像看起来像这样,我不知道为什么?

标签: androidandroid-recyclerview

解决方案


将项目更改scaleType为,这将使图像具有定义尺寸(s),并将裁剪剩余部分,使所有图像尺寸相同。ImageViewcenter_cropdp

像这样:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/imagethumb"
        android:layout_width="180dp"
        android:layout_height="200dp"
        android:scaleType="center_crop"/>

    <TextView
        android:id="@+id/nothing"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

推荐阅读