在回收站内的 cardview 中滑动图像的最佳方法是什么?

What is the best way to do sliding images in cardview inside recycler?

我有一个 RecyclerViewCardview。我想在这个 CardView 中滑动图像,就像在 OLX 应用程序中一样。最好的方法是什么? 我考虑将 viewpager 放在 cardview 中。可以吗,或者我应该试试别的东西?

我用 ViewPager 做到了,但看起来太慢了。这是 viewpager 适配器的一部分。

 @Override
public Object instantiateItem(ViewGroup collection, int position) {

    LayoutInflater inflater = LayoutInflater.from(mContext);
    ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.viewpager_custom, collection, false);
    collection.addView(layout);

    ImageView image = (ImageView) layout.findViewById(R.id.viewPagerImageView);
    image.setImageResource(mPics[position]);

    return layout;
}

我会在 GitHub 上使用以下库来实施此更改。它可以让您快速滑动并在完成后从 ListView 中删除该项目。

使用下面的示例来帮助您:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mItems = new ArrayList<>(30);
    for (int i = 0; i < 30; i++) {
        mItems.add(String.format("Card number %2d", i));
    }

    mAdapter = new CardViewAdapter(mItems);

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setAdapter(mAdapter);

    SwipeableRecyclerViewTouchListener swipeTouchListener =
            new SwipeableRecyclerViewTouchListener(mRecyclerView,
                    new SwipeableRecyclerViewTouchListener.SwipeListener() {
                        @Override
                        public boolean canSwipe(int position) {
                            return true;
                        }

                        @Override
                        public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
                            for (int position : reverseSortedPositions) {
                                mItems.remove(position);
                                mAdapter.notifyItemRemoved(position);
                            }
                            mAdapter.notifyDataSetChanged();
                        }

                        @Override
                        public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
                            for (int position : reverseSortedPositions) {
                                mItems.remove(position);
                                mAdapter.notifyItemRemoved(position);
                            }
                            mAdapter.notifyDataSetChanged();
                        }
                    });

    mRecyclerView.addOnItemTouchListener(swipeTouchListener);

希望这对您有所帮助:)

你走对了。

只做一件事加载压缩位图而不是未压缩位图。 您直接将位图资源设置为图像视图。要么使用像 Picasso 这样的库 https://github.com/square/picasso/

或使用 google 的官方资源来高效加载大型位图。

首先将此方法复制到您的 activity:

public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

然后这个解码位图的方法:

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

然后像这样加载位图:

@Override
public Object instantiateItem(ViewGroup collection, int position) {

    LayoutInflater inflater = LayoutInflater.from(mContext);
    ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.viewpager_custom, collection, false);
    collection.addView(layout);

    ImageView image = (ImageView) layout.findViewById(R.id.viewPagerImageView);
    image.setImageBitmap(
    decodeSampledBitmapFromResource(getResources(), R.id.myimage, reqwidth, reqheight));

    return layout;
}