2017-07-01 7 views
0

私はウェブサイトから多数のデータをロードし、それらを表示するためのページを作成するシンプルなビューページャテストアプリケーションを作成しています。 ほとんどの場合、表示はほとんどすべての作品です。しかし、新しいデータセットをロードして表示すると、表示されなくなります。新しいセットを取得すると、すべてのデータが完全にロードされますが、ビュー0から開始するのではなく、ランダムな位置から開始されます。終わりか途中から始めることができます。 本のように、すべてのデータを1ページ目からロードします。新しい本を読み込む場合は、1ページ目からランダムなページではなく、書籍が開始されます。アンドロイドViewPagerは、リロード後に間違ったランダムな位置から開始されます

リロード通話

私は()クラス内のローカル変数を設定するGotCampDetailsを使用してみました。

viewPager.setCurrentItem(0);

私の断片では動作しません。私のアダプタでnotifydatasetchanged()とも呼ばれ、まだ動作しませんでした。

私には何が欠けていますか?

public class ViewPagerFragment extends Fragment implements WebReadResultsListener { 

private ArrayList<HashMap<String, String>> campDetails; 
CustomPagerAdapter adapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    return inflater.inflate(R.layout.camp_viewpager, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 

    if (campDetails != null && ! campDetails.isEmpty()) { 
     ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
     adapter = new CustomPagerAdapter(getActivity(), campDetails, viewPager); 
     viewPager.setAdapter(adapter); 
     viewPager.setPageTransformer(true, new ZoomOutPageTransformer()); 
    } 
} 

@Override 
public boolean GotCampDetails(ArrayList<HashMap<String, String>> campDetails) { 
    this.campDetails = campDetails; 
    return true; 
} 

@Override 
public boolean GotCampList(ArrayList<HashMap<String, String>> campDetails) { 
    return false; 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    getFragmentManager().putFragment(outState,"fragmentInstanceSaved",getFragmentManager().findFragmentById(R.id.content)); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Handle orientation changes here 
} 
} 

アダプタ:

public class CustomPagerAdapter extends PagerAdapter implements ColorChangeListener { 
private ArrayList<HashMap<String, String>> campDetails; 
private ViewGroup collection; 
private Context mContext; 
private boolean isRunning = false; 
private ColorChangeListener colorChangeListener; 
private int color= pink; 
private int currentposition; 
private ViewPager viewPager; 

public CustomPagerAdapter(Context context, final ArrayList<HashMap<String, String>> campDetails, ViewPager viewPager) { 
    this.campDetails=campDetails; 
    this.mContext = context; 
    this.viewPager = viewPager; 
    colorChangeListener = (ColorChangeListener) mContext; 

    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int pos) { 
      currentposition = pos; 
      if (campDetails.get(currentposition).get("color").equals("green")) { 
       color = green; 
      } else { 
       color = pink; 
      } 
      ColorAppBar(color); 
     } 
     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 
     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 
} 

@Override 
public Object instantiateItem(ViewGroup collection, final int position) { 
    LayoutInflater inflater = LayoutInflater.from(mContext); 
    ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.child_item, collection, false); 

    if (campDetails.size() <= 0) { 
     Toast.makeText(mContext, "Error in getting camp details", Toast.LENGTH_SHORT).show(); 
     return null; 
    } 

    if (campDetails.get(position).get("description").equals("RD")) { 
     layout.setBackgroundColor(mContext.getResources().getColor(green)); 
    } else { 
     layout.setBackgroundColor(mContext.getResources().getColor(pink)); 
    } 

    collection.addView(layout); 
    this.collection = collection; 

    TextView eName = (TextView) layout.findViewById(R.id.en); 
    TextView nEName= (TextView) layout.findViewById(R.id.nen); 
    TextView textView6 = (TextView) layout.findViewById(R.id.textView6); 
    // ImageView nextImg = (ImageView) groupLayout.get(index).findViewById(R.id.nextImg); 

    eName.setText(campDetails.get(position).get("name")); 
    if (position+1 < campDetails.size()) { 
     nEName.setText(campDetails.get(position+1).get("name")); 
     textView6.setVisibility(View.VISIBLE); 
    } else { 
     nEName.setText("You are DONE!!"); 
     textView6.setVisibility(View.INVISIBLE); 
    } 


    return layout; 
} 

@Override 
public void destroyItem(ViewGroup collection, int position, Object view) { 
    collection.removeView((View) view); 
} 

@Override 
public int getCount() { 
    return campDetails.size(); 
} 

@Override 
public boolean isViewFromObject(View view, Object object) { 
    return view == object; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    return campDetails.get(position).get("name"); 
} 

@Override 
public void ColorAppBar(int color) { 
    colorChangeListener.ColorAppBar(color); 
} 
} 

答えて

0

私はついにそれを達成することができました。

私はsetCurrentItem関数呼び出しを数ミリ秒遅らせる必要がありました。レースの状態?なぜこれが当てはまるのか分かりませんが、今は完全に動作しています。 他の人が役に立つと思われる場合に備えて、次のように追加しました。

pager.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      pager.setCurrentItem(pos); 
     } 
    }, 100); 
0

私は問題を特定するために十分な詳細を、次の問題が発生したんだけど、この男はあなたが何をしようとして達成しているようだ:dynamically add and remove view to viewpager

助けて欲しいと思っています。

+1

詳細情報にはどのような情報が追加できますか? – Arn

+0

私はいくつかのテストを実行しました...開始インデックスは、使用されていた以前のアダプタの "count()"と同じです。したがって、7つのアイテムがあるデータセットをロードして、最後まで、7ページ目に移動して、新しいデータセットをロードしようとすると、ビューページは新しいデータセットの7ページから開始します。私が何をしても、ページ0をロードすることはできません。 – Arn

関連する問題