gpt4 book ai didi

Android - 将外部存储中的图像列表到 Recycleview

转载 作者:行者123 更新时间:2023-11-30 05:11:21 26 4
gpt4 key购买 nike

我正在尝试做一件简单的事情,它将所有图像从外部存储中获取到回收 View 并显示它们。

我的问题是,出于某种原因,我收到了 null,但我不知道为什么。我成功地将所有图像放入字符串数组列表中。然后在 Reycleview 上我收到空异常错误。找不到我做错了什么。

日志显示错误来自 Recycler。来自方法“onBindViewHolder”(我也提到了这一行)。它崩溃了 holder.imgView.setImageURI(imageUri); - 仍然不明白为什么,即使我检查它不为空。

我的代码

          private BootstrapButton btnLoadImage;
private RecyclerView rvImages;
private static final int REQUEST_CODE = 1;
private boolean mStoragePermissions;
private ArrayList<String> imageLists;
private ImageViewAdapter adapter;


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


btnLoadImage = (BootstrapButton)findViewById(R.id.btnLoadImges);
rvImages = (RecyclerView)findViewById(R.id.rvPictures);


btnLoadImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mStoragePermissions){
imageLists = getFilePaths();
Log.d("MainActivity",imageLists.toString());
if(imageLists != null)
setAdapter(imageLists);
}else{
verifyStoragePermissions();
}

}
});
}

private void setAdapter(ArrayList<String> imageLists) {
adapter = new ImageViewAdapter(getApplication(),imageLists);
rvImages.setAdapter(adapter);
rvImages.setLayoutManager(new GridLayoutManager(getApplication(),3));
btnLoadImage.setVisibility(View.INVISIBLE);
}

public ArrayList<String> getFilePaths()
{


Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.ImageColumns.DATA};
Cursor c = null;
SortedSet<String> dirList = new TreeSet<String>();
ArrayList<String> resultIAV = new ArrayList<String>();

String[] directories = null;
if (u != null)
{
c = managedQuery(u, projection, null, null, null);
}

if ((c != null) && (c.moveToFirst()))
{
do
{
String tempDir = c.getString(0);
tempDir = tempDir.substring(0, tempDir.lastIndexOf("/"));
try{
dirList.add(tempDir);
}
catch(Exception e)
{
Log.d("MainActivity",e.getMessage().toString());
}
}
while (c.moveToNext());
directories = new String[dirList.size()];
dirList.toArray(directories);

}

for(int i=0;i<dirList.size();i++)
{
File imageDir = new File(directories[i]);
File[] imageList = imageDir.listFiles();
if(imageList == null)
continue;
for (File imagePath : imageList) {
try {

if(imagePath.isDirectory())
{
imageList = imagePath.listFiles();

}
if ( imagePath.getName().contains(".jpg")|| imagePath.getName().contains(".JPG")
|| imagePath.getName().contains(".jpeg")|| imagePath.getName().contains(".JPEG")
|| imagePath.getName().contains(".png") || imagePath.getName().contains(".PNG") )
{
String path= imagePath.getAbsolutePath();

resultIAV.add(path);
}
}
// }
catch (Exception e) {
e.printStackTrace();
}
}
}

return resultIAV;

}


public class ImageViewAdapter extends RecyclerView.Adapter<ImageViewHolder>{
private LayoutInflater inflater;
private Context context;
private ArrayList<String> data;

public ImageViewAdapter(Context context, ArrayList<String> data){
this.context = context;
this.inflater = LayoutInflater.from(context);
this.data = data;
}

@NonNull
@Override
public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = inflater.inflate(R.layout.image_item,parent,false);
return new ImageViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
String imgSrc = data.get(position);
Uri imageUri = Uri.parse(imgSrc);

if(imageUri != null) {
//**Here i always getting null exception **
holder.imgView.setImageURI(imageUri);
}
}

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

}


public class ImageViewHolder extends RecyclerView.ViewHolder{
private ImageView imgView;

public ImageViewHolder(View itemView){
super(itemView);
imgView = (ImageView)findViewById(R.id.imageView);
}
}
}

最佳答案

在你的ImageViewHolder

中这个是空的
ImageView imgView;
您正在使用

imgView = (ImageView)findViewById(R.id.imageView);

但请注意,findViewById 正在您的 Activity 中查找 View ,而不是在您的RecyclerView ViewHolder 中,恰好在您的image_item.xml 根目录中布局。

因此,只需在该 View 中使用 findViewById:

public ImageViewHolder(View itemView){
super(itemView);
imgView = (ImageView) itemView.findViewById(R.id.imageView);
}

关于Android - 将外部存储中的图像列表到 Recycleview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53687482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com