java.lang.IndexOutOfBoundsException:索引:0,大小:0?
所以,我正在创建一个网格视图 此活动的目的是通过使用网格视图进入将要显示的目录,该网格视图将从我的照片中显示我的照片。它应该能够正确显示我从网格视图中选择的图像 但是,当我进入活动时,它会崩溃并重新启动应用程序 Logcatjava.lang.IndexOutOfBoundsException:索引:0,大小:0?,java,android,indexoutofboundsexception,Java,Android,Indexoutofboundsexception,所以,我正在创建一个网格视图 此活动的目的是通过使用网格视图进入将要显示的目录,该网格视图将从我的照片中显示我的照片。它应该能够正确显示我从网格视图中选择的图像 但是,当我进入活动时,它会崩溃并重新启动应用程序 Logcat java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:411)
at com.example.dmckoy.myapplication.Search.GalleryFragment.setupGridView(GalleryFragment.java:133)
at com.example.dmckoy.myapplication.Search.GalleryFragment.access$100(GalleryFragment.java:34)
at com.example.dmckoy.myapplication.Search.GalleryFragment$3.onItemSelected(GalleryFragment.java:108)
下面是错误3的来源:
第一个代码:
setImage(imgURLs.get(0), galleryImage, mAppend);
public class GalleryFragment extends Fragment {
private static final String TAG = "GalleryFragment";
setupGridView(directories.get(position));
public class GalleryFragment extends Fragment {
private static final String TAG = "GalleryFragment";
//constants
private static final int NUM_GRID_COLUMNS = 3;
//widgets
private GridView gridView;
private ImageView galleryImage;
private ProgressBar mProgressBar;
private Spinner directorySpinner;
//var
private ArrayList<String> directories;
private String mAppend = "file:/";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_gallery, container, false);
galleryImage = (ImageView) view.findViewById(R.id.galleryImageView);
gridView = (GridView) view.findViewById(R.id.gridView);
directorySpinner = (Spinner) view.findViewById(R.id.spinnerDirectory);
mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);
mProgressBar.setVisibility(View.GONE);
directories = new ArrayList<>();
Log.d(TAG, "onCreateView: started. ");
ImageView shareClose = (ImageView) view.findViewById(R.id.ivCloseShare);
shareClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: closing the gallery fragment. ");
getActivity().finish();
}
});
TextView nextScreen = (TextView) view.findViewById(R.id.tvNext);
nextScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: navigating to the final share screen. ");
}
});
init();
return view;
}
private void init() {
FilePath filePath = new FilePath();
//check for other folder inside "/storage/emulated/0/pictures
if (FileSearch.getDirectoryPaths(filePath.Picture) != null) {
directories = FileSearch.getDirectoryPaths(filePath.Picture);
}
directories.add(filePath.CAMERA);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_spinner_item, directories);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
directorySpinner.setAdapter(adapter);
directorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: selected. " + directories.get(position));
//setup our image grid for the directory chosen
setupGridView(directories.get(position));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
private void setupGridView(String selectedDirectory) {
Log.d(TAG, "setupGridView: directory chosen: " + selectedDirectory);
final ArrayList<String> imgURLs = FileSearch.getFilePaths(selectedDirectory);
//set the grid column width
int gridWidth = getResources().getDisplayMetrics().widthPixels;
int imageWidth = gridWidth/NUM_GRID_COLUMNS;
gridView.setColumnWidth(imageWidth);
//use the grid adapter to adapter the image to gridview file://
GridImageAdapter adapter = new GridImageAdapter(getActivity(), R.layout.layout_grid_imageview, mAppend, imgURLs);
gridView.setAdapter(adapter);
//set the first image to be displayed whent the activity fragment view is inflated
setImage(imgURLs.get(0), galleryImage, mAppend);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: selected an image: " + imgURLs.get(position));
setImage(imgURLs.get(position), galleryImage, mAppend);
}
});
}
private void setImage(String imgURL, ImageView image, String append){
Log.d(TAG, "setImage: setting image");
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(append + imgURL, image, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
mProgressBar.setVisibility(View.INVISIBLE);
}
});
}
}
秒:
setImage(imgURLs.get(0), galleryImage, mAppend);
public class GalleryFragment extends Fragment {
private static final String TAG = "GalleryFragment";
setupGridView(directories.get(position));
public class GalleryFragment extends Fragment {
private static final String TAG = "GalleryFragment";
//constants
private static final int NUM_GRID_COLUMNS = 3;
//widgets
private GridView gridView;
private ImageView galleryImage;
private ProgressBar mProgressBar;
private Spinner directorySpinner;
//var
private ArrayList<String> directories;
private String mAppend = "file:/";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_gallery, container, false);
galleryImage = (ImageView) view.findViewById(R.id.galleryImageView);
gridView = (GridView) view.findViewById(R.id.gridView);
directorySpinner = (Spinner) view.findViewById(R.id.spinnerDirectory);
mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);
mProgressBar.setVisibility(View.GONE);
directories = new ArrayList<>();
Log.d(TAG, "onCreateView: started. ");
ImageView shareClose = (ImageView) view.findViewById(R.id.ivCloseShare);
shareClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: closing the gallery fragment. ");
getActivity().finish();
}
});
TextView nextScreen = (TextView) view.findViewById(R.id.tvNext);
nextScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: navigating to the final share screen. ");
}
});
init();
return view;
}
private void init() {
FilePath filePath = new FilePath();
//check for other folder inside "/storage/emulated/0/pictures
if (FileSearch.getDirectoryPaths(filePath.Picture) != null) {
directories = FileSearch.getDirectoryPaths(filePath.Picture);
}
directories.add(filePath.CAMERA);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_spinner_item, directories);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
directorySpinner.setAdapter(adapter);
directorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: selected. " + directories.get(position));
//setup our image grid for the directory chosen
setupGridView(directories.get(position));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
private void setupGridView(String selectedDirectory) {
Log.d(TAG, "setupGridView: directory chosen: " + selectedDirectory);
final ArrayList<String> imgURLs = FileSearch.getFilePaths(selectedDirectory);
//set the grid column width
int gridWidth = getResources().getDisplayMetrics().widthPixels;
int imageWidth = gridWidth/NUM_GRID_COLUMNS;
gridView.setColumnWidth(imageWidth);
//use the grid adapter to adapter the image to gridview file://
GridImageAdapter adapter = new GridImageAdapter(getActivity(), R.layout.layout_grid_imageview, mAppend, imgURLs);
gridView.setAdapter(adapter);
//set the first image to be displayed whent the activity fragment view is inflated
setImage(imgURLs.get(0), galleryImage, mAppend);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: selected an image: " + imgURLs.get(position));
setImage(imgURLs.get(position), galleryImage, mAppend);
}
});
}
private void setImage(String imgURL, ImageView image, String append){
Log.d(TAG, "setImage: setting image");
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(append + imgURL, image, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
mProgressBar.setVisibility(View.INVISIBLE);
}
});
}
}
第三名:
setImage(imgURLs.get(0), galleryImage, mAppend);
public class GalleryFragment extends Fragment {
private static final String TAG = "GalleryFragment";
setupGridView(directories.get(position));
public class GalleryFragment extends Fragment {
private static final String TAG = "GalleryFragment";
//constants
private static final int NUM_GRID_COLUMNS = 3;
//widgets
private GridView gridView;
private ImageView galleryImage;
private ProgressBar mProgressBar;
private Spinner directorySpinner;
//var
private ArrayList<String> directories;
private String mAppend = "file:/";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_gallery, container, false);
galleryImage = (ImageView) view.findViewById(R.id.galleryImageView);
gridView = (GridView) view.findViewById(R.id.gridView);
directorySpinner = (Spinner) view.findViewById(R.id.spinnerDirectory);
mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);
mProgressBar.setVisibility(View.GONE);
directories = new ArrayList<>();
Log.d(TAG, "onCreateView: started. ");
ImageView shareClose = (ImageView) view.findViewById(R.id.ivCloseShare);
shareClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: closing the gallery fragment. ");
getActivity().finish();
}
});
TextView nextScreen = (TextView) view.findViewById(R.id.tvNext);
nextScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: navigating to the final share screen. ");
}
});
init();
return view;
}
private void init() {
FilePath filePath = new FilePath();
//check for other folder inside "/storage/emulated/0/pictures
if (FileSearch.getDirectoryPaths(filePath.Picture) != null) {
directories = FileSearch.getDirectoryPaths(filePath.Picture);
}
directories.add(filePath.CAMERA);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_spinner_item, directories);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
directorySpinner.setAdapter(adapter);
directorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: selected. " + directories.get(position));
//setup our image grid for the directory chosen
setupGridView(directories.get(position));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
private void setupGridView(String selectedDirectory) {
Log.d(TAG, "setupGridView: directory chosen: " + selectedDirectory);
final ArrayList<String> imgURLs = FileSearch.getFilePaths(selectedDirectory);
//set the grid column width
int gridWidth = getResources().getDisplayMetrics().widthPixels;
int imageWidth = gridWidth/NUM_GRID_COLUMNS;
gridView.setColumnWidth(imageWidth);
//use the grid adapter to adapter the image to gridview file://
GridImageAdapter adapter = new GridImageAdapter(getActivity(), R.layout.layout_grid_imageview, mAppend, imgURLs);
gridView.setAdapter(adapter);
//set the first image to be displayed whent the activity fragment view is inflated
setImage(imgURLs.get(0), galleryImage, mAppend);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: selected an image: " + imgURLs.get(position));
setImage(imgURLs.get(position), galleryImage, mAppend);
}
});
}
private void setImage(String imgURL, ImageView image, String append){
Log.d(TAG, "setImage: setting image");
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(append + imgURL, image, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
mProgressBar.setVisibility(View.INVISIBLE);
}
});
}
}
以下是完整的代码:
setImage(imgURLs.get(0), galleryImage, mAppend);
public class GalleryFragment extends Fragment {
private static final String TAG = "GalleryFragment";
setupGridView(directories.get(position));
public class GalleryFragment extends Fragment {
private static final String TAG = "GalleryFragment";
//constants
private static final int NUM_GRID_COLUMNS = 3;
//widgets
private GridView gridView;
private ImageView galleryImage;
private ProgressBar mProgressBar;
private Spinner directorySpinner;
//var
private ArrayList<String> directories;
private String mAppend = "file:/";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_gallery, container, false);
galleryImage = (ImageView) view.findViewById(R.id.galleryImageView);
gridView = (GridView) view.findViewById(R.id.gridView);
directorySpinner = (Spinner) view.findViewById(R.id.spinnerDirectory);
mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);
mProgressBar.setVisibility(View.GONE);
directories = new ArrayList<>();
Log.d(TAG, "onCreateView: started. ");
ImageView shareClose = (ImageView) view.findViewById(R.id.ivCloseShare);
shareClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: closing the gallery fragment. ");
getActivity().finish();
}
});
TextView nextScreen = (TextView) view.findViewById(R.id.tvNext);
nextScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: navigating to the final share screen. ");
}
});
init();
return view;
}
private void init() {
FilePath filePath = new FilePath();
//check for other folder inside "/storage/emulated/0/pictures
if (FileSearch.getDirectoryPaths(filePath.Picture) != null) {
directories = FileSearch.getDirectoryPaths(filePath.Picture);
}
directories.add(filePath.CAMERA);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_spinner_item, directories);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
directorySpinner.setAdapter(adapter);
directorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: selected. " + directories.get(position));
//setup our image grid for the directory chosen
setupGridView(directories.get(position));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
private void setupGridView(String selectedDirectory) {
Log.d(TAG, "setupGridView: directory chosen: " + selectedDirectory);
final ArrayList<String> imgURLs = FileSearch.getFilePaths(selectedDirectory);
//set the grid column width
int gridWidth = getResources().getDisplayMetrics().widthPixels;
int imageWidth = gridWidth/NUM_GRID_COLUMNS;
gridView.setColumnWidth(imageWidth);
//use the grid adapter to adapter the image to gridview file://
GridImageAdapter adapter = new GridImageAdapter(getActivity(), R.layout.layout_grid_imageview, mAppend, imgURLs);
gridView.setAdapter(adapter);
//set the first image to be displayed whent the activity fragment view is inflated
setImage(imgURLs.get(0), galleryImage, mAppend);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: selected an image: " + imgURLs.get(position));
setImage(imgURLs.get(position), galleryImage, mAppend);
}
});
}
private void setImage(String imgURL, ImageView image, String append){
Log.d(TAG, "setImage: setting image");
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(append + imgURL, image, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
mProgressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
mProgressBar.setVisibility(View.INVISIBLE);
}
});
}
}
公共类GalleryFragment扩展了片段{
私有静态最终字符串标记=“GalleryFragment”;
//常数
私有静态final int NUM_GRID_COLUMNS=3;
//小部件
私有GridView GridView;
私人图像查看画廊图像;
私人ProgressBar mProgressBar;
私人微调器主管微调器;
//变量
私有ArrayList目录;
私有字符串mAppend=“file:/”;
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment_gallery,container,false);
galleryImage=(ImageView)view.findViewById(R.id.galleryImage视图);
gridView=(gridView)view.findViewById(R.id.gridView);
directorySpinner=(Spinner)view.findViewById(R.id.spinnerDirectory);
mProgressBar=(ProgressBar)view.findViewById(R.id.ProgressBar);
mProgressBar.setVisibility(View.GONE);
目录=新的ArrayList();
d(标记“onCreateView:started”);
ImageView shareClose=(ImageView)view.findViewById(R.id.ivCloseShare);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Log.d(标记“onClick:关闭库片段”);
getActivity().finish();
}
});
TextView nextScreen=(TextView)view.findViewById(R.id.tvNext);
nextScreen.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Log.d(标记“onClick:导航到最终共享屏幕”);
}
});
init();
返回视图;
}
私有void init(){
FilePath FilePath=新文件路径();
//检查“/存储/模拟/0/图片”中的其他文件夹
if(FileSearch.getdirectorypath(filePath.Picture)!=null){
directories=FileSearch.getdirectorypath(filePath.Picture);
}
目录.add(filePath.CAMERA);
ArrayAdapter=新的ArrayAdapter(getActivity(),
android.R.layout.simple\u微调器(项目、目录);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
directorySpinner.setAdapter(适配器);
directorySpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
Log.d(标记“onItemClick:selected.”+directories.get(position));
//为所选目录设置图像网格
setupGridView(directories.get(position));
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
}
私有void setupGridView(字符串选择目录){
d(标记“setupGridView:directory selected:”+selectedDirectory);
final ArrayList imgURLs=FileSearch.getfilepath(selectedDirectory);
//设置网格列宽度
int gridWidth=getResources().getDisplayMetrics().widthPixels;
int imageWidth=gridWidth/NUM\u GRID\u列;
gridView.setColumnWidth(imageWidth);
//使用网格适配器将图像适配到网格视图文件://
GridImageAdapter=新的GridImageAdapter(getActivity(),R.layout.layout_grid_imageview,mAppend,imgURLs);
setAdapter(适配器);
//设置活动片段视图膨胀时要显示的第一个图像
setImage(imgURLs.get(0)、galleryImage、mAppend);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Log.d(标记“onItemClick:选择了一个图像:”+imgURLs.get(位置));
setImage(imgURLs.get(位置)、galleryImage、mAppend);
}
});
}
私有void setImage(字符串imgURL、ImageView image、字符串append){
Log.d(标签,“设置图像:设置图像”);
ImageLoader ImageLoader=ImageLoader.getInstance();
displayImage(append+imgURL,image,newImageLoadingListener(){
@凌驾
public void onLoadingStarted(字符串imageUri,视图){
mProgressBar.setVisibility(View.VISIBLE);
}
@凌驾
public void onload失败(字符串imageUri、视图视图、失败原因){
mProgressBar.setVisibility(视图.不可见);
}
@凌驾
public void onLoadingComplete(字符串imageUri、视图视图、位图加载图像){
mProgressBar.setVisibility(视图.不可见);
}
@凌驾
public void onLoadingCancelled(字符串imageUri,视图){
mProgressBar.setVisibility(视图.不可见);
}
});
}
}
java.lang.IndexOutOfBoundsException:索引:0,大小:0
您正在使用:
setImage(imgURLs.get(0), galleryImage, mAppend);
这意味着imgURLs
有0个元素。在使用
imgURLs.get(0)
之前,只需检查它是否有第一个元素,例如:
if (imgURLs != null && imgURLs.size()>=1) { ... }