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

相关问题