11

Ho un RecyclerView con Cardview s. Voglio immagini scorrevoli all'interno di questo CardView, proprio come nell'app OLX. Qual è il modo migliore per farlo? Penso a mettere viewpager all'interno di cardview. Va bene o forse dovrei provare qualcos'altro?Qual è il modo migliore per fare le immagini scorrevoli in cardview all'interno del recycler?

L'ho fatto con ViewPager ma sembra troppo lento. Ecco una parte dell'adattatore 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; 
} 

enter image description here

+1

Qual è la direzione ? Verticale o orizzontale? – Sufian

+1

Vuoi che lo scorrimento sia interattivo dall'utente (ovvero l'utente trascina le diapositive) o altrimenti automatico? –

+0

@Sufian orizzontale – SERG

risposta

7

Si sta andando nel modo giusto.

Basta fare una cosa per caricare bitmap compresse invece di quelle non compresse. Stai impostando direttamente la risorsa bitmap sulla tua visualizzazione di immagini. O usare una libreria come Picasso https://github.com/square/picasso/

o utilizzare fonte ufficiale di Google per caricare in modo efficiente grandi bitmap.

In primo luogo copiare questo metodo nella vostra attività:

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

Quindi questo metodo per decodificare le bitmap:

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

Poi caricare il bitmap come questo:

@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

Vorrei utilizzare il seguente biblioteca GitHub per implementare questa modifica. Ti consente di scorrere rapidamente e rimuovere l'elemento dallo ListView una volta terminato.

Utilizzare l'esempio seguente per aiutarvi a:

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

Spero che questo aiuti :)

Problemi correlati