2016-08-03 142 views
0

我最近试图编码一个图库类型的应用程序,可以显示手机图像的缩略图。对于我用RecyclerView,我调整使用本教程中的位图:https://developer.android.com/training/displaying-bitmaps/load-bitmap.htmlRecyclerView显示多个图像

然而,当我跑我的应用我意识到,有一次只显示一个图像,而不是像多我所期待的。在这张图片上,我们可以清楚地看到两张图片之间的巨大差距,而这不是第三张无法加载的图片。

Screenshot

这里是我的代码:

public class MainActivity extends AppCompatActivity { 

RecyclerView recycler_received; 

ArrayList<Bitmap> liste_received; 


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


    recycler_received=(RecyclerView)findViewById(R.id.recycle_pictures_sent); 

    liste_received=new ArrayList<>(); 

    String dir="/sdcard/DCIM/Camera/"; 

    String[] liste_photos={"IMG_20160521_141348.jpg","IMG_20160521_141348.jpg","IMG_20160521_141627.jpg","IMG_20160521_142946.jpg", 
      "IMG_20160521_185556.jpg","IMG_20160528_174737.jpg"}; 

    if (isStoragePermissionGranted()) 
    { 
     for(int i=0;i<5;i++){ 
      liste_received.add(ResizeBitmap.decodeSampledBitmapFromResource(getResources(),dir+liste_photos[i],200,200)); 
     } 

    } 

    Adapter adapter=new Adapter(this,liste_received); 
    recycler_received.setAdapter(adapter); 
    recycler_received.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false)); 







} 

public boolean isStoragePermissionGranted() { 
    if (Build.VERSION.SDK_INT >= 23) { 
     if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       == PackageManager.PERMISSION_GRANTED) { 
      Log.v("info","Permission is granted"); 
      return true; 
     } else { 

      Log.v("info","Permission is revoked"); 
      ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
      return false; 
     } 
    } 
    else { //permission is automatically granted on sdk<23 upon installation 
     Log.v("info","Permission is granted"); 
     return true; 
    } 


} 

和我的适配器:

public class Adapter extends RecyclerView.Adapter<Adapter.PicHolder> { 


public static class PicHolder extends RecyclerView.ViewHolder{ 

    public ImageView mimage_sent; 

    public PicHolder(View itemview){ 
     super(itemview); 
     mimage_sent=(ImageView)itemview.findViewById(R.id.image_gallery); 
    } 
} 

private ArrayList<Bitmap> data; 
private Context context; 

public Adapter(Context mcontext, ArrayList<Bitmap> mdata){ 
    context=mcontext; 
    data=mdata; 
} 

private Context getContext() { 
    return context; 
} 


@Override 
public Adapter.PicHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    Context context=parent.getContext(); 
    LayoutInflater inflater= LayoutInflater.from(context); 

    View galleryView=inflater.inflate(R.layout.recyclerview_layout, parent, false); 

    PicHolder picHolder=new PicHolder(galleryView); 


    return picHolder; 
} 

@Override 
public void onBindViewHolder(PicHolder holder, int position) { 

    Bitmap bitmap= data.get(position); 

    ImageView imageView=holder.mimage_sent; 
    imageView.setImageBitmap(bitmap); 

} 


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

我怎么能填两个项目之间的差距?

另外,有没有人有一个想法,我怎么可以加载存储在目录(ex:/sdcard/DCIM/Camera)的每个图片,而不必像我在MainActivity那样列出所有图片?

编辑:

这里是主要的布局:

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


<android.support.v7.widget.RecyclerView 
    android:layout_width="fill_parent" 
    android:layout_height="120dp" 
    android:id="@+id/recycler_pictures_received" 

    > 

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

</RelativeLayout> 

和我的项目:

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

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/image_gallery"/> 

</LinearLayout> 
+0

请出示这两个布局XML文件 –

+0

这有t o做适配器而不是'RecyclerView'。 您必须更改用于项目的.xml布局。 –

+0

当我阅读你的评论时,我意识到什么是错的。我的项目布局的“线性布局”中有'匹配父'。 非常感谢! – Cornetto

回答

0

试试这个代码:

onCreate bundel(){ 

RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),2); 
     recyclerView.setLayoutManager(layoutManager); 

}