11

Ich habe eine RecyclerView mit Cardview s. Ich möchte Bilder in diesem CardView verschieben, genau wie in der OLX-App. Was ist der beste Weg? Ich denke über Viewpager in Cardview setzen. Ist es in Ordnung oder vielleicht sollte ich etwas anderes versuchen?Was ist der beste Weg, gleitende Bilder in Cardview Inside Recycler zu machen?

Ich habe es mit ViewPager gemacht, aber es sieht aus wie zu langsam. Hier ist ein Teil des Viewpager-Adapters.

@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; 
} 

enter image description here

+1

Was ist die Richtung, ? Vertikal oder horizontal? – Sufian

+1

Möchten Sie, dass das Verschieben benutzerinteraktiv ist (d. H. Der Benutzer zieht die Dias) oder anderweitig automatisch? –

+0

@Sufian horizontal – SERG

Antwort

7

Sie sind auf dem richtigen Weg.

Nur eine Sache laden komprimierte Bitmaps statt unkomprimierte Bitmaps. Sie setzen die Bitmap-Ressource direkt auf Ihre Bildansicht. Verwenden Sie entweder eine Bibliothek wie Picasso https://github.com/square/picasso/

oder Googles offizielle Quelle verwenden für große Bitmaps effizient zu laden.

Erstens diese Methode in Ihrer Tätigkeit kopieren:

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; 
} 

Dann ist diese Methode Bitmaps zu entschlüsseln:

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); 
} 

Dann laden Sie Ihre Bitmap wie folgt aus:

@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; 
} 
1

würde ich die folgende Bibliothek auf GitHub verwenden diese Änderung zu implementieren. Es erlaubt Ihnen, horizontal zu wischen und das Objekt aus der ListView zu entfernen, sobald Sie damit fertig sind.

das Beispiel unten verwenden, Ihnen zu helfen:

@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); 

this helps :)