首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何解决 java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 Android Studio?

如何解决 java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 Android Studio?
EN

Stack Overflow用户
提问于 2018-08-08 01:22:04
回答 1查看 0关注 0票数 0

有以下错误:

代码语言:txt
复制
tabian.com.hash E/AndroidRuntime: FATAL EXCEPTION: main
Process: tabian.com.hash, PID: 29587
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
    at java.util.ArrayList.get(ArrayList.java:308)
    at tabian.com.hash.Share.GalleryFragment.setupGridView(GalleryFragment.java:159)
    at tabian.com.hash.Share.GalleryFragment.access$300(GalleryFragment.java:38)
    at tabian.com.hash.Share.GalleryFragment$3.onItemSelected(GalleryFragment.java:134)
代码语言:txt
复制
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;

//vars
private ArrayList<String> directories;
private String mAppend = "file:/";
private String mSelectedImage;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_gallery, container, false);
    galleryImage = view.findViewById(R.id.galleryImageView);
    gridView = view.findViewById(R.id.gridView);
    directorySpinner = view.findViewById(R.id.spinnerDirectory);
    mProgressBar = view.findViewById(R.id.progressBar);
    mProgressBar.setVisibility(View.GONE);
    directories = new ArrayList<>();
    Log.d(TAG, "onCreateView: started.");

    ImageView shareClose = view.findViewById(R.id.ivCloseShare);
    shareClose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "onClick: closing the gallery fragment.");
            Objects.requireNonNull(getActivity()).finish();
        }
    });

    TextView nextScreen = 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.");

            if(isRootTask()){
                Intent intent = new Intent(getActivity(), NextActivity.class);
                intent.putExtra(getString(R.string.selected_image), mSelectedImage);
                startActivity(intent);
            }else{
                Intent intent = new Intent(getActivity(), AccountSettingsActivity.class);
                intent.putExtra(getString(R.string.selected_image), mSelectedImage);
                intent.putExtra(getString(R.string.return_to_fragment), getString(R.string.edit_profile_fragment));
                startActivity(intent);
                Objects.requireNonNull(getActivity()).finish();
            }

        }
    });

    init();

    return view;
}

private boolean isRootTask(){
    return ((ShareActivity) Objects.requireNonNull(getActivity())).getTask() == 0;
}

private void init(){
    FilePaths filePaths = new FilePaths();

    //check for other folders inside "/storage/emulated/0/pictures"
    if (FileSearch.getDirectoryPaths(filePaths.PICTURES) != null) {
        directories = FileSearch.getDirectoryPaths(filePaths.PICTURES);
    }
    directories.add(filePaths.CAMERA);

    ArrayList<String> directoryNames = new ArrayList<>();
    for (int i = 0; i < directories.size(); i++) {
        Log.d(TAG, "init: directory: " + directories.get(i));
        int index = directories.get(i).lastIndexOf("/");
        String string = directories.get(i).substring(index);
        directoryNames.add(string);
    }

    ArrayAdapter<String> adapter = new ArrayAdapter<>(Objects.requireNonNull(getActivity()),
            android.R.layout.simple_spinner_item, directoryNames);
    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 images to gridview
    GridImageAdapter adapter = new GridImageAdapter(getActivity(), R.layout.layout_grid_imageview, mAppend, imgURLs);
    gridView.setAdapter(adapter);

    //set the first image to be displayed when the activity fragment view is inflated
    try{
        setImage(imgURLs.get(1), galleryImage, mAppend);
        mSelectedImage = imgURLs.get(1);
    }catch (ArrayIndexOutOfBoundsException e){
        Log.e(TAG, "setupGridView: ArrayIndexOutOfBoundsException: " +e.getMessage() );
    }

    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);
            mSelectedImage = imgURLs.get(position);
        }
    });

}

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);
        }
    });
}
}
EN

回答 1

Stack Overflow用户

发布于 2018-08-08 11:08:22

imgURLs是空的,要使position == 1,因为空适配器可能是有头/页脚的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档