Android - список изображений из внешнего хранилища в Recycleview - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь сделать простую вещь и получить все изображения из внешнего хранилища в режиме повторного просмотра и отобразить их.

Моя проблема в том, что по какой-то причине я получаю ноль, и я не знаю почему.Я успешно получаю все изображения в массив списка строк.И затем в 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);
    }
   }
  }

1 Ответ

0 голосов
/ 09 декабря 2018

Что это ноль в вашем ImageViewHolder

<code>ImageView imgView;
Вы используете
imgView = (ImageView)findViewById(R.id.imageView);

Но посмотрите, что findViewById находит представление в вашей деятельности , а не в RecyclerView ViewHolder , именно в вашем image_item.xml корневом макете.

Итак, просто используйте findViewById в этом представлении:

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