ListView 行中的多个图像 return 错误

Multiple images in ListView Row return error

ListView 行中有多个图像

我正在尝试制作在单行中包含多个图像的列表视图,如下图所示

错误

我想我知道错误是因为当我滚动 viewPager 时 arrayList<> 大小发生了变化....但我没有解决方案..该怎么做

我将图像路径存储在数据库中..并在打开列表视图时从 SD 卡中获取图像

 java.lang.IndexOutOfBoundsException: Invalid index 2, size is 0
            at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
            at java.util.ArrayList.get(ArrayList.java:308)
            at com.serpentcs.artlovers.main.CustomCursorAdapter$CustomPagerAdapter.instantiateItem(CustomCursorAdapter.java:329)
            at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:869)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:1085)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:951)
            at android.support.v4.view.ViewPager.run(ViewPager.java:250)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:549)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Activity

 @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.notidata, container, false);

        lvContent = (ListView) rootView.findViewById(R.id.lv_conetent);

        lvContent.setAdapter(adapter);

        return rootView;
    }

*用于 Listview 的 CustomCursor 适配器和用于视图寻呼机的寻呼机适配器 *

public class CustomCursorAdapter extends CursorAdapter {
    private LayoutInflater cursorInflater;


    //for imge
    ArrayList<Stuff> mArrayList;
    CustomPagerAdapter mCustomPagerAdapter;


    public CustomCursorAdapter(Context context, Cursor c, boolean autoRequery) {
        super(context, c, autoRequery);
        // TODO Auto-generated constructor stub
        cursorInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public void bindView(View view, final Context context, final Cursor cursor) {
        // TODO Auto-generated method stub
        TextView title = (TextView) view.findViewById(R.id.tv_title);
        TextView summary = (TextView) view.findViewById(R.id.tv_summary);
        TextView name = (TextView) view.findViewById(R.id.tv_name);
        title.setText(cursor.getString(cursor.getColumnIndex("title")));

        name.setText(cursor.getString(cursor.getColumnIndex("name")));
        summary.setText(cursor.getString(cursor.getColumnIndex("summary")));
//        final String img = cursor.getString(cursor.getColumnIndex("img"));
        String id = cursor.getString(cursor.getColumnIndex("_id"));

        mArrayList = new ArrayList<Stuff>();
        if (Getimage(context, id) == 1) {
            mCustomPagerAdapter = new CustomPagerAdapter(context, mArrayList);

            ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewpager_img);
            mViewPager.setVisibility(view.VISIBLE);
//        mViewPager.setId(Integer.parseInt(id));
            mViewPager.setAdapter(mCustomPagerAdapter);
        } else {
            ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewpager_img);
            mViewPager.setVisibility(view.GONE);
        }




    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        // TODO Auto-generated method stub


        return cursorInflater.inflate(R.layout.notidata_layout, parent, false);
    }



    /**
     * for horizontal imageView
     */
    class Stuff {
        private String imgName;
        private int imgPosition;

        // getters

        public String getImgName() {
            return this.imgName;
        }

        public void setImgName(String imgName) {
            this.imgName = imgName;
        }

        public Integer getImgPosition() {
            return this.imgPosition;
        }

        public void setImgPosition(int imgPosition) {
            this.imgPosition = imgPosition;
        }
    }


    private int Getimage(Context mContext, String id) {
        int returnValue = 1;

        DatabaseHelper databaseHelper = new DatabaseHelper(mContext);

        SQLiteDatabase db = databaseHelper.getWritableDatabase();

        db = mContext.openOrCreateDatabase("artlovers.db",
                SQLiteDatabase.CREATE_IF_NECESSARY, null);

        String[] columns = {"_id,img"};

        String selection = "p_id=?";
        String[] selectionArg = {id};

//        Log.e("id of database",""+id);

        Cursor c = db.query("img", columns, selection, selectionArg, null, null,
                null);


//        Log.e("", "" + DatabaseUtils.dumpCursorToString(c));
        int counter = 0;

//        Log.e("","------"+c.getCount());

        if (c.getCount() != 0) {
            while (c != null && c.moveToNext()) {
                counter++;
                Stuff s = new Stuff();
                s.setImgName(c.getString(c.getColumnIndex("img")));
                s.setImgPosition(counter);
                mArrayList.add(s);

//                Log.i("", "name=" + c.getString(c.getColumnIndex("img")) + "    counter" + counter);

            }
            returnValue = 1;
        } else {
            returnValue = 0;
        }




        return returnValue;
    }


    class CustomPagerAdapter extends PagerAdapter {

        Context mContext;
        LayoutInflater mLayoutInflater;
        private int mcount;
        ArrayList<Stuff> marrayList;

        public CustomPagerAdapter(Context context, ArrayList<Stuff> arrayList1) {
            mContext = context;
            marrayList = arrayList1;
            mLayoutInflater = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

//


        @Override
        public int getCount() {
//            Log.e("", "" + marrayList.size());
//            notifyDataSetChanged();
            return marrayList.size();
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {

            return view == ((LinearLayout) object);
        }


        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View itemView = mLayoutInflater.inflate(R.layout.pager_item,
                    container, false);

            ImageView imageView = (ImageView) itemView
                    .findViewById(R.id.imageView);
            imageView.setImageBitmap(BitmapFactory.decodeFile(new File(
                    "/sdcard/artlovers/"
                            + mArrayList.get(position).getImgName())
//error at "mArrayList.get(position).getImgName())"
                    .getAbsolutePath()));

            container.addView(itemView);


            return itemView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((LinearLayout) object);
        }
    }




}

提前感谢您的建议、评论和回答.

错误于 mArrayList.get(position).getImgName())

mArrayList = new ArrayList<Stuff>();
    if (Getimage(context, id) == 1) {
        mCustomPagerAdapter = new CustomPagerAdapter(context, mArrayList);

您在适配器中使用

  ArrayList<Stuff> marrayList;

你混淆了 marrayList 和 mArrayList

需要使用 marrayList,最好遵循 android 指南避免此类错误。