2012-06-22 10 views
7

私はページを切り替えるためにViewpagerを使用しています。私は私のカスタムカーソルアダプタからデータを取得しているViewPagerの5ページを持っています。問題は、ページの切り替えがスムーズでない、不安定です。何が間違っているのですか?どんな助けでも本当に感謝しています。将来的にはViewPagerのページを切り替えるのがスムーズでない

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

}

//カスタムアダプタ

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

各 'instantiateItem()'でディスクI/O( 'getSharedPreferences()')をやめ、 'StrictMode'とTraceviewを使ってどこが間違っているのか調べます。 – CommonsWare

+1

私は** Commonsware **の提案に従って、TraceView中にアダプタがレイアウトを膨らませるのに時間がかかりすぎていることが分かりました。私はlistVIew行に対して3つの線形レイアウトを使用していたので、Parentlayoutを相対レイアウトに変更し、子ビューを配列して目的の出力を得ました。それは私のために働いた、今ビューパージャーはスムーズです。ありがとうCommonsware。 – kay

答えて

6

、少しのコードを投稿してみてください。同様に、問題が発生していると思われる特定の領域を分離してください。私はあなたが知らないかもしれないことを理解しています。この場合は、両方ともAdaptersをダンプしても問題ありません。読めるコードが少なくても、誰かがあなたを助けるのがやや簡単だと分かります。

できるだけ早く、setOffScreenPageLimitViewPagerから試してください。

アイドル状態のビュー階層の現在のページのいずれかの側に保持する必要があるページ数を設定します。この を超えるページは、必要に応じてアダプタから再作成されます。

Here are the docs for it.

YOURPAGER.setOffscreenPageLimit(LIMIT); 
+1

私はすでにmyPager.setOffscreenPageLimit(4)を使用しています。しかし、助けてくれてありがとう。 – kay

0

あなたがマニフェストに設定することができ、 "アンドロイド:hardwareAcceleratedは=" "真"。

関連する問題