2012-06-22 7 views
7

Ich verwende Viewpager, um zwischen den Seiten zu wechseln. Ich habe fünf Seiten in ViewPager, die Daten von meinem benutzerdefinierten Cursor-Adapter abrufen. Das Problem ist das Wechseln der Seiten ist nicht glatt, es ist abgehackt. Was mache ich falsch ? Jede Hilfe wird wirklich geschätzt.Seiten in ViewPager zu wechseln ist nicht glatt

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

}

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


} 
+0

Beenden Sie Datenträger-E/A ('GetSharedPreferences()') auf jedem 'instanziateItem()', und verwenden Sie dann 'StrictMode' und Traceview, um zu untersuchen, wo sonst Sie möglicherweise falsch laufen. – CommonsWare

+1

Ich folgte dem Vorschlag von ** Commonsware ** und fand heraus, dass der Adapter bei TraceView zu viel Zeit in Anspruch nimmt, um Layouts aufzublasen. Ich habe drei lineare Layouts für listVIEW-Zeilen verwendet, also habe ich gerade das Parentlayout in relatives Layout und arrangierte Childviews geändert, um die gewünschte Ausgabe zu erhalten. Das hat für mich funktioniert, jetzt ist Viewpager flüssig. Danke Commonsware. – kay

Antwort

6

in Zukunft versuchen, ein wenig weniger Code veröffentlichen. Wie in, versuchen Sie, die spezifischen Bereiche zu isolieren, von denen Sie glauben, dass das Problem auftritt. Ich verstehe, dass Sie möglicherweise nicht wissen, und in diesem Fall dumping beide Ihre Adapters ist in Ordnung. Sie sollten wissen, dass es für Sie einfacher ist, Ihnen zu helfen, wenn weniger Code zum Lesen vorhanden ist.

Soweit was Sie tun können, sollten Sie versuchen, setOffScreenPageLimit von ViewPager verwenden.

Legen Sie die Anzahl der Seiten fest, die auf beiden Seiten der aktuellen Seite in der Ansichtshierarchie im Leerlauf gehalten werden sollen. Seiten über diese Grenze werden bei Bedarf vom Adapter neu erstellt.

Here are the docs for it.

Beispiel

YOURPAGER.setOffscreenPageLimit(LIMIT); 
+1

Ich habe bereits myPager.setOffscopePageLimit (4) verwendet. Aber Danke, dass du versucht hast zu helfen. – kay

0

Sie in ihrem Manifest festlegen "android: hardwareAccelerated =" true "". Es ist sehr glatt mit diesem

Verwandte Themen