【问题标题】:RecyclerView CardLayout images getting smaller in size after each refresh每次刷新后 RecyclerView CardLayout 图像都会变小
【发布时间】:2017-12-04 12:04:25
【问题描述】:

我在具有 5 个选项卡的 TabLayout 上使用 RecyclerView 和 CardLayout,每个选项卡都表示为一个片段。每当我单击选项卡时,我首先检查片段是否可见。如果为真,我将执行我的 UI 代码,其中涉及调用 REST 服务以从 db 中获取数据,然后通过自定义适配器填充到 RecyclerView。我暂时将数据缓存在 ArrayList 中,以便频繁尝试片段不需要另一个 REST 请求。我的问题是,每当我多次导航到某个选项卡时,每次尝试后布局都会变得越来越小。下面是我的 Fragment、Adapter 和 Adapter 布局。

public class BeerFragment extends Fragment {
    private RecyclerView recyclerView;
    ProgressDialog pd;
    private View rootView;
    private static final String TAG = BeerFragment.class.getSimpleName();
    public static boolean isLoadedBeer = false;
    public boolean instantiated = false;
    public BeerFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        rootView  = inflater.inflate(R.layout.activity_main2, container, false);
        initViews();
        return rootView;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && MaintainState.isLoadedBeer) {
            initViews();
        } else if (isVisibleToUser && !MaintainState.isLoadedBeer) {
        } else if (!isVisibleToUser && MaintainState.isLoadedBeer){
        } else if (!isVisibleToUser && !MaintainState.isLoadedBeer){
            MaintainState.isLoadedBeer = true;
        }
    }

    private void initViews(){
        pd = new ProgressDialog(getActivity());
        pd.setMessage("Fetching Beer...");
        pd.setCancelable(false);
        pd.show();
        Log.d("snopww4","noppww");
        try {
        } catch (Exception e) {
            e.printStackTrace();
        }

        recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
        ArrayList albumList = new ArrayList<>();
        GalleryAdapter  adapter = new GalleryAdapter(getActivity(), albumList,2);
        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 2);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.addItemDecoration(new GridSpacingItemDecoration(2, GridSpacingItemDecoration.dpToPx(getActivity(), 10), true));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);

        if (!isLoadedBeer) {
            Log.d("lklk","lklk");
        String drink = FilterFragment.sorted;
        if (drink.equals("empty")){
            loadBeer("beer");
            FilterFragment.sorted = "empty";
        } else if (drink.equals("lager")){
            loadBeer("lager");
            FilterFragment.sorted = "empty";
        } else if (drink.equals("stout")){
            loadBeer("stout");
            FilterFragment.sorted = "empty";
        } else if (drink.equals("malt")){
            loadBeer("malt");
            FilterFragment.sorted = "empty";
        } else {
            pd.hide();
        }
    } else {
        recyclerView.setAdapter(new GalleryAdapter(getActivity(), MaintainState.getItemsBeer(), 1));
        recyclerView.smoothScrollToPosition(0);
        pd.hide();
    }
    }

    private void loadBeer(final String item){
        try{
            Client Client = new Client();
            Service apiService = Client.getClient().create(Service.class);
            Call<GalleryResponse> call = apiService.getBeer(item);
            call.enqueue(new Callback<GalleryResponse>() {
                @Override
                public void onResponse(Call<GalleryResponse> call, Response<GalleryResponse> response) {
                    List<Gallery> items = response.body().getBeer();
                    recyclerView.setAdapter(new GalleryAdapter(getActivity(), items, 2));
                    recyclerView.smoothScrollToPosition(0);
                    MaintainState.setItemsBeer(items);
                    isLoadedBeer = true;
                    pd.hide();
                }

                @Override
                public void onFailure(Call<GalleryResponse> call, Throwable t) {
                    pd.hide();

                }
            });
        }catch (Exception e){
        }
    }
}



public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.MyViewHolder> {

    private Context mContext;
    private List<Gallery> albumList;
    private int tabPosition;
    private LocalStore localStore;
    private static final String TAG = GalleryAdapter.class.getSimpleName();

    public GalleryAdapter(Context mContext, List<Gallery> albumList, int tabPosition) {
        Log.i(TAG, "INIT GalleryAdapter");
        this.mContext = mContext;
        this.albumList = albumList;
        this.tabPosition = tabPosition;
        localStore = new LocalStore(mContext);
    }


    @Override
    public GalleryAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.album_card2, viewGroup, false);
        CardView cardView = (CardView) view.findViewById(R.id.card_view);
        cardView.setMaxCardElevation(GridSpacingItemDecoration.dpToPx(mContext, 10));
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final GalleryAdapter.MyViewHolder viewHolder, int i) {
        viewHolder.title.setText(albumList.get(i).getName());
        viewHolder.title.setTypeface(Display.displayTypefaceCabin(mContext, 1), Typeface.BOLD);
        viewHolder.count.setText("Ksh "+albumList.get(i).getPrice());
        viewHolder.count.setTypeface(Display.displayTypefaceWalkWay(mContext, 1), Typeface.BOLD);
        viewHolder.tag.setTypeface(Display.displayTypefaceOpenSansCondensed(mContext, 1), Typeface.BOLD);

        Glide.with(mContext).
                load(albumList.get(i).getThumbnail()).
                placeholder(R.drawable.placeholder).
                error(R.drawable.placeholder).
                fitCenter().
                into(viewHolder.thumbnail);
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title, count, tag;
        public ImageView thumbnail, favourite;

        public MyViewHolder(final View view) {
            super(view);
            tag = (TextView) view.findViewById(R.id.tag);
            title = (TextView) view.findViewById(R.id.title);
            count = (TextView) view.findViewById(R.id.count);
            thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
            favourite = (ImageView) view.findViewById(R.id.favourite);

            thumbnail.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                }
            });
        }
    }
}


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:background="#f2f5f7"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_marginLeft="-10dp"
        card_view:cardCornerRadius="10dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:background="@drawable/image_view_drop_shadow"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/tag"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingTop="3dp"
                android:paddingBottom="3dp"
                android:text="hello"
                android:textColor="@color/white"
                android:textSize="12dp"/>

            <ImageView
                android:id="@+id/favourite"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:layout_marginTop="5dp"
                android:layout_marginRight="5dp"
                android:layout_alignParentRight="true"/>

            <ImageView
                android:id="@+id/thumbnail"
                android:layout_width="match_parent"
                android:layout_height="220dp"
                android:clickable="true"
                android:scaleType="fitXY" />

            <TextView
                android:id="@+id/title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/thumbnail"
                android:gravity="center"
                android:textColor="#000000"
                android:paddingBottom="5dp"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/count"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/title"
                android:gravity="center"
                android:paddingBottom="15dp"
                android:textSize="14sp" />

        </RelativeLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>

【问题讨论】:

    标签: android android-recyclerview android-tablayout cardlayout


    【解决方案1】:

    这是一个疯狂的猜测。

    我认为正在发生的事情是您的片段多次调用initViews(),每次调用它时,您都在添加一个装饰,增加某种间距,从而为您的实际视图腾出更少的空间。

    非常快速的测试,删除下面的行,看看问题是否消失。

     recyclerView.addItemDecoration(new GridSpacingItemDecoration(2, GridSpacingItemDecoration.dpToPx(getActivity(), 10), true));
    

    如果是这样,请调试您的 initView() 方法以查看它是否被调用超过了您的需要,或者可能将 initView() 方法分成两部分,一对一的事情 DecoratorAnimator...等等,另一个更新视图中的数据。

    【讨论】:

    • 哟!你的疯狂猜测有帮助!
    【解决方案2】:

    我遇到了类似的问题,图片在 recyclerview 刷新时变小。 我使用 Glide 并寻找可能的问题。 Glide 文档说明:

    有时在使用 RecyclerView 时,视图可能会被重复使用并保留先前位置的大小,该大小将更改为当前位置。要处理这些情况,您可以创建一个新的 [ViewTarget 并为 waitForLayout 传入 true]:

    @Override
    public void onBindViewHolder(VH holder, int position) {
      Glide.with(fragment)
        .load(urls.get(position))
        .into(new DrawableImageViewTarget(holder.imageView, /*waitForLayout=*/ true));
    

    在 Glide 4.6.1 中,DrawableImageViewTarget(ImageView, waitForLayout) 已被弃用,因此我以:

    GlideApp.with(context)
                            .load(imageUrl)
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .into(new ViewTarget<ImageView, Drawable>(holder.imageView) {
                                @Override
                                public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                                    holder.imageView.setImageDrawable(resource);
                                }
                            }
                            .waitForLayout());
    

    它帮助我解决了问题。

    【讨论】:

      【解决方案3】:

      这是因为 initViews()。你打了两次电话,第一次来自onCreate,第二次来自setUserVisibleHint

      RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 2);
              recyclerView.setLayoutManager(mLayoutManager);
      

      这将在每次刷新后缩小您的尺寸。

      【讨论】:

      • 我知道 onCreateView 只会在第一次调用片段时被调用一次。其他加载片段的尝试不会调用它。
      猜你喜欢
      • 2016-08-29
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2014-01-15
      • 2013-04-01
      相关资源
      最近更新 更多