2012-06-22 15 views
7

Estoy usando Viewpager para cambiar de página. Tengo cinco páginas en ViewPager que están obteniendo datos de mi adaptador de cursor personalizado. El problema es cambiar de página, no es fácil, está entrecortado. Qué estoy haciendo mal ? Cualquier ayuda es muy apreciada .cambiar páginas en ViewPager no es fluido

// 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; 
    } 

} adaptador

// encargo

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


} 
+0

Deje de hacer E/S de disco ('getSharedPreferences()') en cada 'instanciateItem()', y luego use 'StrictMode' y Traceview para examinar dónde más puede estar yendo mal. – CommonsWare

+1

Seguí la sugerencia de ** Commonsware ** y descubrí que el adaptador tarda demasiado tiempo en inflar los diseños durante TraceView. Estaba usando tres diseños lineales para las filas de la lista VI, así que acabo de cambiar la distribución de los padres por el diseño relativo y las vistas de niños organizadas para obtener el resultado deseado. Eso funcionó para mí, ahora viewpager es sencillo. Gracias, Commonsware. – kay

Respuesta

6

En el futuro, tratar de publicar un poco menos código. Al igual que en el caso, intente aislar las áreas específicas en las que puede pensar que está ocurriendo el problema. Entiendo que es posible que no lo sepa, y en este caso, el hecho de que se haya descargado su Adapters es correcto. Simplemente sepa que es ligeramente más fácil para cualquier persona ayudarle cuando hay menos código para leer.

En cuanto a lo que puede hacer, debe intentar usar setOffScreenPageLimit desde ViewPager.

Establezca el número de páginas que se deben conservar en cualquier lado de la página actual en la jerarquía de vistas en estado inactivo. Las páginas más allá de este límite se recrearán desde el adaptador cuando sea necesario.

Here are the docs for it.

Ejemplo

YOURPAGER.setOffscreenPageLimit(LIMIT); 
+1

ya he usado myPager.setOffscreenPageLimit (4). Pero gracias por intentar ayudar. – kay

0

se puede establecer en el que manifiesta "android: hardwareAccelerated =" true "". Es muy sencillo con eso

Cuestiones relacionadas