カレンダー アプリでこの問題が発生しました。これは理解できますが、回避方法がわかりません。
ビューページャーを無限ページャーとして使用しています (ページ数を 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;
}
これについて私に助けをください、または私の問題が明確でない場合は躊躇しないでください! 乾杯