实现接入多个U盘,读取各个U盘图片,并按U盘名在recyclerView分组展示图片,点击U盘名可以隐藏折叠U盘内的图片代码实现 
时间: 2023-04-08 12:03:09 浏览: 40
以下是代码实现:
首先,需要在 AndroidManifest.xml 文件中添加以下权限:
```xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```
然后,在布局文件中添加一个 RecyclerView 和一个 TextView,用于展示 U 盘名和图片:
```xml
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/tv_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="No images found"
android:textSize="20sp"
android:visibility="gone" />
```
接下来,需要编写一个类来表示 U 盘和其内的图片:
```java
public class UsbItem {
private String name;
private List<String> images;
public UsbItem(String name, List<String> images) {
this.name = name;
this.images = images;
}
public String getName() {
return name;
}
public List<String> getImages() {
return images;
}
}
```
然后,需要编写一个 Adapter 来展示 U 盘和其内的图片:
```java
public class UsbAdapter extends RecyclerView.Adapter<UsbAdapter.ViewHolder> {
private List<UsbItem> items;
public UsbAdapter(List<UsbItem> items) {
this.items = items;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_usb, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
UsbItem item = items.get(position);
holder.tvName.setText(item.getName());
holder.rvImages.setAdapter(new ImageAdapter(item.getImages()));
}
@Override
public int getItemCount() {
return items.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvName;
RecyclerView rvImages;
ViewHolder(@NonNull View itemView) {
super(itemView);
tvName = itemView.findViewById(R.id.tv_name);
rvImages = itemView.findViewById(R.id.rv_images);
rvImages.setLayoutManager(new GridLayoutManager(itemView.getContext(), 3));
}
}
}
```
其中,item_usb.xml 布局文件如下:
```xml
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_images"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone" />
</LinearLayout>
</androidx.cardview.widget.CardView>
```
接下来,需要编写一个 Adapter 来展示 U 盘内的图片:
```java
public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder> {
private List<String> images;
public ImageAdapter(List<String> images) {
this.images = images;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String image = images.get(position);
Glide.with(holder.itemView.getContext()).load(image).into(holder.ivImage);
}
@Override
public int getItemCount() {
return images.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView ivImage;
ViewHolder(@NonNull View itemView) {
super(itemView);
ivImage = itemView.findViewById(R.id.iv_image);
}
}
}
```
其中,item_image.xml 布局文件如下:
```xml
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/iv_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />
```
最后,在 MainActivity 中,需要获取 U 盘列表,并将其展示在 RecyclerView 中:
```java
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private TextView tvEmpty;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
tvEmpty = findViewById(R.id.tv_empty);
List<UsbItem> items = getUsbItems();
if (items.isEmpty()) {
recyclerView.setVisibility(View.GONE);
tvEmpty.setVisibility(View.VISIBLE);
} else {
recyclerView.setVisibility(View.VISIBLE);
tvEmpty.setVisibility(View.GONE);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new UsbAdapter(items));
}
}
private List<UsbItem> getUsbItems() {
List<UsbItem> items = new ArrayList<>();
File[] files = new File("/storage").listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory() && file.canRead() && !file.getAbsolutePath().startsWith("/storage/emulated/")) {
String name = file.getName();
List<String> images = new ArrayList<>();
File[] imageFiles = file.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile() && file.canRead() && file.getName().toLowerCase().endsWith(".jpg");
}
});
if (imageFiles != null) {
for (File imageFile : imageFiles) {
images.add(imageFile.getAbsolutePath());
}
}
if (!images.isEmpty()) {
items.add(new UsbItem(name, images));
}
}
}
}
return items;
}
}
```
以上就是实现接入多个 U 盘,读取各个 U 盘图片,并按 U 盘名在 RecyclerView 分组展示图片,点击 U 盘名可以隐藏折叠 U 盘内的图片的代码实现。
相关推荐

















