0

我正在使用PagerSlidingTabs。我有兩個片段,每個片段有一個列表視圖。我添加了TabListener,因爲當用戶重新選擇相同的選項卡時,我想在listview中選擇第一項。這僅適用於第二個片段(選項卡)。問題是第二個listview的smoothScrollToPosition(0)方法工作但是第一個listview的smoothScrollToPosition(0)方法(所有方法)不工作。第一個listview在屏幕上正常顯示,但它的id似乎是第二個listview的id。我如何使用viewpager在片段中使用不同的listviews

PagerAdapter:

public class PagerAdapter extends FragmentPagerAdapter { 
private Context mContext; 
private int mPageCount; 

public PagerAdapter(Context context, FragmentManager fm, int pageCount) { 
    super(fm); 
    this.mContext = context; 
    this.mPageCount = pageCount; 
} 

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

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 0: 
      return Fragment1.newInstance(position); 
     case 1: 
      return Fragment2.newInstance(position); 

     default: 
      return null; 
    } 

}} 

片段1:

public class Fragment1 extends Fragment { 

private static final String ARG_POSITION = "position"; 
private ListView mListView1; 
private ListAdapter mAdapter; 

public static Fragment1 newInstance(int position) { 
    Fragment1 f = new Fragment1(); 
    Bundle b = new Bundle(); 
    b.putInt(ARG_POSITION, position); 
    f.setArguments(b); 
    return f; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if (mRootView == null) { 
     mRootView = inflater.inflate(R.layout.fragment1, container, false); 
     mListView1 = (ListView) mRootView.findViewById(R.id.listview1); 
     . 
     . 
     if (mAdapter == null) { 
      mAdapter = new ListAdapter(getActivity(), mListView1, R.layout.list_item, mDatas); 
      mListView1.setAdapter(mAdapter); 
     } else { 
      mAdapter.notifyDataSetChanged(); 
     } 
     . 
     . 
     ((HomeActivity) getActivity()).getPagerSlidingTabStrip().setOnTabListener(new TabListener() { 
      @Override 
      public void onTabReselected(View tab, int postion) { 
       mListView1.smoothScrollToPosition(0); 
       //mListView1's id seems to mListView2's id 
       //when reselect first tab, application acting like i reselect second tab. 
      } 
     }); 
    } else { 
     ((ViewGroup) mRootView.getParent()).removeView(mRootView); 
    } 
    return mRootView; 
}} 

Fragment2:

public class Fragment2 extends Fragment { 

private static final String ARG_POSITION = "position"; 
private ListView mListView2; 
private ListAdapter mAdapter; 

public static Fragment2 newInstance(int position) { 
    Fragment2 f = new Fragment2(); 
    Bundle b = new Bundle(); 
    b.putInt(ARG_POSITION, position); 
    f.setArguments(b); 
    return f; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if (mRootView == null) { 
     mRootView = inflater.inflate(R.layout.fragment2, container, false); 
     mListView2 = (ListView) mRootView.findViewById(R.id.listview2); 
     . 
     . 
     if (mAdapter == null) { 
      mAdapter = new ListAdapter(getActivity(), mListView2, R.layout.list_item, mDatas); 
      mListView2.setAdapter(mAdapter); 
     } else { 
      mAdapter.notifyDataSetChanged(); 
     } 
     . 
     . 
     ((HomeActivity) getActivity()).getPagerSlidingTabStrip().setOnTabListener(new TabListener() { 
      @Override 
      public void onTabReselected(View tab, int postion) { 
       mListView2.smoothScrollToPosition(0); //this line is working fine 
      } 
     }); 
    } else { 
     ((ViewGroup) mRootView.getParent()).removeView(mRootView); 
    } 
    return mRootView; 
}} 

片段1和Fragment2只有列表視圖(ID:ListView1的,ID:listview2)。 HomeActivity擁有PagerSlidingTabs視圖和viewpager。

我該如何解決這個問題?

回答

0

當您從第二個片段中設置偵聽器時,將從第一個片段替換偵聽器。這就是爲什麼所有的調用似乎要進入第二個選項卡:它的偵聽器是最後一個添加的,所以它接收所有的回調。一種可能的解決方案是聲明一個接口,我們稱之爲OnTabReselctedListener,它有一個方法onTabReselected(into position)。讓您的活動維護這些接口的列表,讓您的片段實現該接口,並將這些片段註冊爲活動中的監聽器。當活動接收到重選事件時,它可以將其傳遞給其子片段;這些片段檢查位置是否與他們自己的位置相匹配,如果他們這樣做,則滾動到頂部。我希望這是有道理的;我從手機上寫這個,所以我不能輕鬆寫出示例代碼。如果你想讓我寫一些,請告訴我!

+0

我現在明白了這個問題。我修好了,現在工作正常。謝謝@nathan :) – demir