I am trying to make listview which have multiple images in single rows as like below image
Error
I think i know error because of arrayList<> size is changedwhen i scroll viewPager .... But i have no solution..how to do it
i am stored image path in database..and fetch image from sdcard when open listview
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$3.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;
}
*CustomCursor adapter for Listview with pager adapter for view pager *
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);
}
}
}
Advance thanks for suggestion,comments,and answers.
error at
mArrayList.get(position).getImgName())
mArrayList = new ArrayList<Stuff>();
if (Getimage(context, id) == 1) {
mCustomPagerAdapter = new CustomPagerAdapter(context, mArrayList);
You use in adapter
ArrayList<Stuff> marrayList;
You get confused into marrayList & mArrayList
Need to use marrayList, better to follow android guidelines to avid this type of mistakes.