3

カレンダー アプリでこの問題が発生しました。これは理解できますが、回避方法がわかりません。

ビューページャーを無限ページャーとして使用しています (ページ数を 3 に設定し、左または右にスワイプするとページの内容が移動します)。3 つの同一のビュー (その日のイベントのビュー) を使用します。各ビュー/日は、イベントのリストビューで表されます。リストビューには、イベントのカスタム表示用のアダプターがあります。

ビューページャーに onPageScrollStateChanged を実装します。左に行く場合(前日)、onPageScrollStateChangedが確定したら、中央の日のデータを右に、左のデータを中央に移動し、左に設定する前日のビューを生成し、最終的にSetCurrentItem を使用して中央に戻ります (無限スクロールが可能です)。私の問題は、リストビューの内容がちらつくことです!! 左のページから中央のページに同じページを渡していることがはっきりとわかりますが、中央のページはまだリストビューアダプターを呼び出していないため、位置を1つに強制すると、リストが初めてロードされるときに再ロードされます...(アダプターによって埋められるため)。この問題を回避するにはどうすればよいですか?

いくつかのコードは理解しやすいかもしれません:

活動クラス:

DayPagerAdapter dayAdapter;
ViewPager myViewPager;
int focusedPage;

 @Override 
public void onCreate(Bundle savedInstanceState) { 
    super.OnCreate(savedInstanceState);
    setContentView(R.layout.main);

    dayAdapter = new DayAdapter(this);
    myViewPager = (ViewPager) findViewyId(R.id.mypager);
    myViewPager.setAdapter(dayAdapter);

    myViewPager.setOnPageChangeListener(new onPageChangeListener(){
   ....
 @Override
public void onPageScrollStateChanged(int state) { 
if (state == ViewPager.SCROLL_STATE_IDLE) {
if (mFocusedPage == 0) 
{
   View dayBefore = (View) myViewPager.getChildAt(0);
   View dayCurrent = (View) myViewPager.getChildAt(1);
   View dayNext = (View) myViewPager.getChildAt(2);
   View newView = (View) dayAdapter.istantiateItem(myViewPager,0);
  //move data
  ListView lvBef = (ListView) dayBefore.findViewById(R.id.lvDay);
  ListView lCur = (ListView) dayCurrent.findViewById(R.id.lvDay);
  ListView lvNext = (ListView) dayNext.findViewById(R.id.lvDay);
  ListView lvNew = (ListView) newView.findViewById(R.id.lvDay);

  lvNext.setAdapter(lvCur.getAdapter());
  lvCur.setAdapter(lvBef.getAdapter());
  lvBefore.setAdapter(lvNew.getAdapter());

  dayAdapter.notifyDataSetChanged();
}                                    
else if (mFocusedPage == 2)  
{
  ..........
}    
// go back to the center allowing to scroll indefinitely
mDayPager.setCurrentItem(1, false);

ViewPager アダプター クラス

class DayAdapterextends PagerAdapter  {

ViewPager container;
Context theContext;
LayoutInflater inflater;

public DayAdapter(Context activityContext)
{
theContext = activityContext;
inflater = (LayoutInflater)theContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeViewAt(position);
}

@Override
public void finishUpdate(View container) {

}

@Override
public int getCount() {
return 3;
}

 @Override
public Object instantiateItem(View container, int position) {

    View newview = infater.inflate(R.layout.dayLayout, null);
    ListView lvListViewDay = (ListView) newview.findViewById(R.id.lvDay);
    ArrayList events = getSomeEvents();
    DayEventAdapter dayAdap = new DayEventAdapter(newview.getContext(), events);
    lvListViewDay.setAdapter(adapSat);
    container.addView(newview,position);
    return newview;
}

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

@Override
public void restoreState(Parcelable state, ClassLoader loader) {

}   

@Override
public Parcelable saveState() {
  return null;
}

@Override
public void startUpdate(View container) {

}

ListView アダプタ クラス

public class DayEventAdapter extends BaseAdapter 
....
public View getView(int position, View convertView, ViewGroup parent) {

if(convertView == null)
  {
   convertView = layoutInflater.inflate(R.layout.event_cell, null);
  }

  //get the event
  CalendarEvent event = (CalendarEvent) getItem(position);
  if(event != null)
  {
    ((TextView) convertView.findViewById(R.id.tvEventCellEventHour)).setText(event.getEvDate());
    ((TextView) convertView.findViewById (R.id.tvEventCellEventDesc)).setText(event.getEvDesc());
  }
  return convertView;
}

これについて私に助けをください、または私の問題が明確でない場合は躊躇しないでください! 乾杯

4

0 に答える 0