2013-02-04 2 views
1

웹상의 모든 곳에서 내 문제를 검색하는 해결책을 찾으려고했지만 아직 해결하지 못했습니다. 어쨌든 여기에 내 문제가 있습니다. 기본적으로 TestWeekActivity (ViewPager 포함)를 시작하면 두 번째 조각/페이지가 첫 번째 문장으로 표시되고 두 번째 문장으로 넘어갈 때 세 번째 문장이 표시됩니다 ... 다른 말로하면 다음 또는 이전 조각/페이지가 항상 표시됩니다. 스 와이프 방향 (왼쪽 또는 오른쪽)에 따라 다릅니다.ViewPager가 잘못된 프래그먼트를 보여줍니다.

퍼팅 로그 내가 슬쩍 할 때마다 FragmentPagerAdapter.getItem (int)이 두 번 호출된다는 것을 알았습니다.이 동작으로 인해 가까운 페이지를 캐시 할 수 있습니다. 하지만 이해가 안되는 것은 getItem 메서드가 호출 될 때 상대 단편화 메서드 onStart도 호출되므로 첫 번째 페이지에서 두 번째 페이지로 스 와이프하면 두 번째로 getItem 메서드가 호출되므로 세 번째 단편이 표시됩니다. 나는 충분히 명확 할 것이 희망한다. TestWeekActivity

package com.bord.shutup; 

import java.util.ArrayList; 

import android.app.ActionBar; 
import android.app.ActionBar.Tab; 
import android.app.ActionBar.TabListener; 
import android.app.FragmentTransaction; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 

public class TestWeekActivity extends FragmentActivity implements TabListener { 

private static final String TAG = "TestWeekActivity"; 

ActionBar mActionBar; 
SectionsPagerAdapter mSectionsPagerAdapter; 
ViewPager mViewPager; 
ArrayList<Fragment> fragments; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_week); 
    mActionBar = getActionBar(); 
    mActionBar.setDisplayHomeAsUpEnabled(true); 
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    // create the Fragment list 
    fragments = new ArrayList<Fragment>(); 
    for (int i = 0; i < 7; i++) { 
     Bundle args = new Bundle(); 
     args.putInt("day", i); 
     Fragment f = DayFragment.newInstance(this); 
     f.setArguments(args); 
     fragments.add(f); 
    } 

    mSectionsPagerAdapter = new SectionsPagerAdapter(
      getSupportFragmentManager(), fragments, getResources() 
        .getStringArray(R.array.day_of_week)); 

    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
    mViewPager 
      .setOnPageChangeListener(new   ViewPager.SimpleOnPageChangeListener() { 

       @Override 
       public void onPageSelected(int position) { 
        Log.d(TAG, "onPageSelected " + position); 
         mActionBar.setSelectedNavigationItem(position); 
       } 
      }); 

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
     mActionBar.addTab(mActionBar.newTab() 
       .setText(mSectionsPagerAdapter.getPageTitle(i)) 
       .setTabListener(this)); 
    } 
} 

// ///////// TabListener stuff //////// 
@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) { 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
} 

// ///////// Menu stuff /////////// 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_events, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     startActivity(new Intent(this, ChooserActivity.class) 
       .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
     return true; 
    case R.id.add_event: 
     startActivity(new Intent(this, CreateWeeklyEventActivity.class) 
       .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
     return true; 
    } 

    return false; 
} 

public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

    private ArrayList<Fragment> fragments; 
    private String[] titles; 

    public SectionsPagerAdapter(FragmentManager fm, 
      ArrayList<Fragment> fragments, String[] titles) { 
     super(fm); 
     this.fragments = fragments; 
     this.titles = titles; 
    } 

    @Override 
    public Fragment getItem(int i) { 
     Log.d(TAG, "getItem called " + i); 
     return fragments.get(i); 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     return titles[position]; 
    } 
    } 

} 

DayFragment

package com.bord.shutup; 

import java.util.Calendar; 

import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.CursorLoader; 
import android.support.v4.content.Loader; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.util.Log; 
import android.view.ActionMode; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsListView.MultiChoiceModeListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 
import android.widget.Toast; 

public class DayFragment extends Fragment implements 
    LoaderManager.LoaderCallbacks<Cursor>, MultiChoiceModeListener, 
    OnItemClickListener { 
private static final String TAG = "DayFragment"; // For debugging 

ListView list_events; 
SimpleCursorAdapter adapter; 
private int day; 

public static DayFragment newInstance(Context context) { 
    DayFragment f = new DayFragment(); 
    return f; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.d(TAG, "onCreate called"); 
    day = getArguments().getInt("day"); 
    Log.d(TAG, "fragment day: " + day); 
    adapter = new SimpleCursorAdapter(getActivity(),    R.layout.row_weekly_event, null, new String[] { 
        EventsProvider.C_TITLE, EventsProvider.C_NOTE, 
        EventsProvider.C_START_TIME_HOUR, 
        EventsProvider.C_START_TIME_MINUTE, 
        EventsProvider.C_END_TIME_HOUR, 
        EventsProvider.C_END_TIME_MINUTE }, new  int[] { 
        R.id.title, R.id.note, R.id.hour_start_time, 
        R.id.minute_start_time, R.id.hour_end_time, 
        R.id.minute_end_time }, 0); 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    int day = getArguments().getInt("day"); 
    Toast.makeText(getActivity(), "Day: " + day , Toast.LENGTH_SHORT).show(); 
} 

// Associate a layout 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    Log.d(TAG, "onCreateView called " + day); 
    return inflater.inflate(R.layout.activity_events, container, false); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    Log.d(TAG, "onActivityCreated called " + day); 
     Log.d(TAG, "set adapter " + day); 
     list_events = (ListView) getActivity().findViewById(
       R.id.list_events); 
     list_events.setAdapter(adapter); 
     list_events.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
     list_events.setMultiChoiceModeListener(this); 
     list_events.setOnItemClickListener(this); 
     getActivity().getSupportLoaderManager().initLoader(day, null, this); 
} 

// ////////// Loader callback /////////// 
@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    Log.d(TAG, "onCreateLoader called with args: " + id); 
    switch (id) { 
    case 0: 
     return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK, 
       null, EventsProvider.C_REPEAT_ON + "=" + Calendar.MONDAY, 
       null, EventsProvider.C_ID + " DESC"); 
    case 1: 
     return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK, 
       null, EventsProvider.C_REPEAT_ON + "=" + Calendar.TUESDAY, 
       null, EventsProvider.C_ID + " DESC"); 
    case 2: 
     return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK, 
       null, 
       EventsProvider.C_REPEAT_ON + "=" + Calendar.WEDNESDAY, 
       null, EventsProvider.C_ID + " DESC"); 
    case 3: 
     return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK, 
       null, EventsProvider.C_REPEAT_ON + "=" + Calendar.THURSDAY, 
       null, EventsProvider.C_ID + " DESC"); 
    case 4: 
     return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK, 
       null, EventsProvider.C_REPEAT_ON + "=" + Calendar.FRIDAY, 
       null, EventsProvider.C_ID + " DESC"); 
    case 5: 
     return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK, 
       null, EventsProvider.C_REPEAT_ON + "=" + Calendar.SATURDAY, 
       null, EventsProvider.C_ID + " DESC"); 
    case 6: 
     return new CursorLoader(getActivity(), EventsProvider.URI_T_WEEK, 
       null, EventsProvider.C_REPEAT_ON + "=" +  Calendar.SUNDAY, 
       null, EventsProvider.C_ID + " DESC"); 
    } 
    return null; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
    Log.d(TAG, "onLoadFinished called"); 
    adapter.swapCursor(cursor); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    Log.d(TAG, "onLoaderReset called"); 
    adapter.swapCursor(null); 
} 

} 

모두에게 감사 사전에 :

여기 내 코드입니다!

추신 : 나는 초보자이므로 날 죽이지 마. ;-) PPS : 나쁜 영어로 죄송합니다.

답변

1

어댑터에서 직접 수행 할 조각 목록을 관리하면 안됩니다. onCreate()에서 '조각 만들기 목록'코드를 제거하고 어댑터의 getItem()에있는 인수를 사용하여 요청한 페이지 조각의 새 인스턴스를 만듭니다.

+0

먼저 감사합니다. fofr 답변! 나는 그 일을하려했지만 내 문제를 해결하지 못했습니다. :-( –

+0

즉, "조각 목록 작성"코드를 제거한 후 adapater의 getItem (int) 메서드에서 요청한 페이지/조각의 새 인스턴스를 만들 더라도 항상 잘못된 조각을 볼 수 있습니다. –

+0

ActionBar 탭, ViewPager 및 FragmentPagerAdapter 하나의 접근 방식을 선택해야합니다. ActionBar 탭 (http://developer.android.com/guide/topics 참조). /ui/actionbar.html#Tabs) – basv

관련 문제