Switching pages in ViewPager is not smooth

I use Viewpager to switch between pages. I have five pages in the ViewPager that receive data from my custom cursor adapter. The problem is that switching pages is not smooth, it is volatile. What am I doing wrong? Any help really appreciated.

// MYPAGER

private class MyPagerAdapter extends PagerAdapter{ public int getCount() { return 5; } public Object instantiateItem(View collection, int position) { LayoutInflater inflater = (LayoutInflater) collection.getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view; SharedPreferences myoptions = getSharedPreferences("options", Context.MODE_PRIVATE); SharedPreferences.Editor prefEditor = myoptions.edit(); view = inflater.inflate(R.layout.all_tasks, null); ((ViewPager) collection).addView(view, 0); //getting list view lv= (ListView)findViewById(R.id.list); MyAdapter adapter1; switch (position) { case 0: prefEditor.putInt("filter", 5); prefEditor.commit(); if(selectedList!=null) { cursor1= managedQuery(uri, PROJECTION, where +" AND "+ taskColumns.LIST+ "= ?" +" AND "+ taskColumns.DONE+ "= ?" ,new String[] {selectedList,"0"}, sortingOrder); } else cursor1= managedQuery(uri, PROJECTION, where+" AND "+ taskColumns.DONE+ "= ?",new String[] {"0"}, sortingOrder); if (cursor1 != null) { cursor1.moveToFirst(); } adapter1 = new MyAdapter(tasks.this,cursor1); lv.setAdapter(adapter1); break; case 1: prefEditor.putInt("filter", 4); prefEditor.commit(); if(selectedList!=null) { cursor1= managedQuery(uri, PROJECTION, taskColumns.LIST+ "= ?" ,new String[] {selectedList}, sortingOrder); } else cursor1= managedQuery(uri, PROJECTION, where,null, sortingOrder); if (cursor1 != null) { cursor1.moveToFirst(); } adapter1 = new MyAdapter(tasks.this,cursor1); lv.setAdapter(adapter1); break; case 2: prefEditor.putInt("filter", 1); prefEditor.commit(); if(selectedList!=null) { cursor1= managedQuery(uri, PROJECTION, where +" AND "+ taskColumns.LIST+ "= ?" ,new String[] {selectedList}, sortingOrder); } else cursor1= managedQuery(uri, PROJECTION, where,null, sortingOrder); if (cursor1 != null) { cursor1.moveToFirst(); } adapter1 = new MyAdapter(tasks.this,cursor1); lv.setAdapter(adapter1); break; case 3: prefEditor.putInt("filter", 2); prefEditor.commit(); if(selectedList!=null) { cursor1= managedQuery(uri, PROJECTION, where +" AND "+ taskColumns.LIST+ "= ?" ,new String[] {selectedList}, sortingOrder); } else cursor1= managedQuery(uri, PROJECTION, where,null, sortingOrder); if (cursor1 != null) { cursor1.moveToFirst(); } adapter1 = new MyAdapter(tasks.this,cursor1); lv.setAdapter(adapter1); break; case 4: prefEditor.putInt("filter", 3); prefEditor.commit(); if(selectedList!=null) { cursor1= managedQuery(uri, PROJECTION, where +" AND "+ taskColumns.LIST+ "= ?" ,new String[] {selectedList}, sortingOrder); } else cursor1= managedQuery(uri, PROJECTION, where,null, sortingOrder); if (cursor1 != null) { cursor1.moveToFirst(); } adapter1 = new MyAdapter(tasks.this,cursor1); lv.setAdapter(adapter1); break; } return view; } @Override public void destroyItem(View arg0, int arg1, Object arg2) { ((ViewPager) arg0).removeView((View) arg2); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == ((View) arg1); } @Override public Parcelable saveState() { return null; } 

}

// user adapter

 static class ViewHolder { public TextView task; public TextView note; public ImageView note_img; public TextView priority; public CheckBox done; public TextView showingByList; public TextView space; public LinearLayout b; } public class MyAdapter extends CursorAdapter { private final int taskIndex; private final LayoutInflater Inflater; private final int doneIndex; private final int priorIndex; private final int rowIndex; private final int taskListIndex; private final int NoteIndex; boolean innewView; public MyAdapter(Context context, Cursor c) { super(context, c); this.taskIndex = c.getColumnIndex(taskColumns.TASK); this.priorIndex = c.getColumnIndex(taskColumns.PRIORITY); this.doneIndex = c.getColumnIndex(taskColumns.DONE); this.rowIndex = c.getColumnIndex(taskColumns._ID); this.taskListIndex = c.getColumnIndex(taskColumns.LIST); this.NoteIndex = c.getColumnIndex(taskColumns.NOTE); this.Inflater = LayoutInflater.from(context); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { View v = Inflater.inflate(R.layout.tasks_row, parent, false); innewView=true; return v; } @Override public void bindView(View view, Context context, final Cursor cursor) { final ViewHolder viewHolder; if(innewView) { viewHolder = new ViewHolder(); viewHolder.task = (TextView) view.findViewById(R.id.task); viewHolder.note = (TextView) view.findViewById(R.id.note); viewHolder.note_img = (ImageView) view.findViewById(R.id.note_img); viewHolder.priority = (TextView) view.findViewById(R.id.priority); viewHolder.done = (CheckBox) view.findViewById(R.id.check); viewHolder.b=(LinearLayout)view.findViewById(R.id.task_layout); viewHolder.showingByList = (TextView) view.findViewById(R.id.tasklist); view.setTag(viewHolder); } else viewHolder = (ViewHolder)view.getTag(); innewView=false; final String task = cursor.getString(taskIndex); String TaskNote = cursor.getString(NoteIndex); int prior= cursor.getInt(priorIndex); int taskDone= cursor.getInt(doneIndex); final long id=cursor.getLong(rowIndex); int uniqueyindex = cursor.getColumnIndex(taskColumns.UNIQUEY); if(TaskNote==null) { viewHolder.note.setVisibility(View.GONE); viewHolder.note_img.setVisibility(View.GONE); } else { if(TaskNote.length()<1) { viewHolder.note.setVisibility(View.GONE); viewHolder.note_img.setVisibility(View.GONE); } else{ viewHolder.note.setVisibility(View.VISIBLE); viewHolder.note_img.setVisibility(View.VISIBLE); } } if(showbyList){ String taskList = cursor.getString(taskListIndex); if(taskList==null) { ContentValues valuey=new ContentValues(); valuey.put(taskColumns.LIST_ID, "0"); valuey.put(taskColumns.LIST, "personal"); Uri mUry = ContentUris.withAppendedId(uri,id); getContentResolver().update(mUry, valuey,null,null); taskList="personal"; } // viewHolder.showingByList.setTypeface(tf); viewHolder.b.setVisibility(View.VISIBLE); viewHolder.space=(TextView)view.findViewById(R.id.space); viewHolder.space.setVisibility(View.VISIBLE); if(cursor.moveToPrevious()){ int comparedResult= taskList.compareTo(cursor.getString(taskListIndex)); if(comparedResult==0) { viewHolder.showingByList.setVisibility(View.GONE); } else{ viewHolder.showingByList.setVisibility(View.VISIBLE); viewHolder.showingByList.setText(taskList.toUpperCase()); } } else{ viewHolder.showingByList.setVisibility(View.VISIBLE); viewHolder.showingByList.setText(taskList.toUpperCase()); } cursor.moveToNext(); viewHolder.showingByList.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { } }); } viewHolder.b.setBackgroundResource(R.drawable.my_drawable1); if(toModify.contains((int)id)) viewHolder.b.setBackgroundResource(R.color.light_blue); viewHolder.task.setText(task); if(TaskNote!=null) viewHolder.note.setText(TaskNote); if(taskDone==1){ viewHolder.done.setChecked(true); viewHolder.task.setTextColor(getResources().getColor(R.color.smooth)); viewHolder.note.setTextColor(getResources().getColor(R.color.smooth)); viewHolder.note_img.setImageResource(R.drawable.note_done2); viewHolder.priority.setBackgroundResource(R.drawable.priornone); } else{ viewHolder.done.setChecked(false); viewHolder.task.setTextColor(getResources().getColor(R.color.darkthemed_text)); viewHolder.note.setTextColor(getResources().getColor(R.color.darkthemed_note)); viewHolder.note_img.setImageResource(R.drawable.note2); if(prior==1){ viewHolder.priority.setBackgroundResource(R.drawable.priornone); } else{ viewHolder.priority.setBackgroundResource(R.color.priority_2); } } } } 
+7
source share
2 answers

In the future, try sending a little less code. As in, try to isolate certain areas that may arise in your situation. I understand that you do not know, and in this case, resetting both of your Adapters in order. Just know that it will be easier for you to help when there is less code to read.

As far as you can do, you should try using setOffScreenPageLimit from ViewPager .

Specify the number of pages to be stored on either side of the current page in the pending view hierarchy. Pages outside this limit will be recreated from the adapter, if necessary.

Here are the docs for him.

Example

  YOURPAGER.setOffscreenPageLimit(LIMIT); 
+6
source

you can specify in your manifest "android: hardwareAccelerated =" true "". It is very smooth with this.

0
source

All Articles