2017-02-26 64 views
-1

我的應用程序有一個宿主嵌套viewPager的片段(每次添加一個片段),所有視圖鏈接到相同的佈局。ViewPager錯誤OnItemClick位置

每個片段都有一個固定的按鈕+ recylerview,它從Firebase適配器檢索其數據。

當我點擊按鈕時,它顯示正確的viewPager位置。但是,如果我點擊列表視圖項目(viewHolder),它會在viewPager中顯示下一個預先加載的位置。

這裏的viewpager和根片段的尋呼機適配器

Explore.java

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View root = inflater.inflate(R.layout.fragment_explore, container, false); 
    array = controller.SELECTED_CATEGORIES; 
    viewPager = (ViewPager) root.findViewById(R.id.viewPager); 
    tabLayout = (TabLayout) root.findViewById(R.id.categories_tablayout); 
    tabLayout.setupWithViewPager(viewPager); 
    mAdapter = new MyAdapter(getFragmentManager()); 
    viewPager.setAdapter(mAdapter); 
    return root; 
} 

public static class MyAdapter extends FragmentStatePagerAdapter { 

public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return controller.SELECTED_CATEGORIES.length; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return CategoriesFragment.newInstance(position); 
    } 
    @Override 
    public CharSequence getPageTitle(final int position) { 
     return controller.SELECTED_CATEGORIES[position]; 
    } 
} 

CategoriesFragment.java

static CategoriesFragment newInstance(int num) { 
    CategoriesFragment f = new CategoriesFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("num", num); 
    f.setArguments(args); 

    return f; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    rootView = inflater.inflate(R.layout.fragment_categories, container, false); 
    initialize(); 
    listCategoriesFeed = (RecyclerView) rootView.findViewById(R.id.listCategoriesFeeds); 
    categoriesFeedAdapter = new CategoriesFeedAdapter(CategoriesFeedItem.class, R.layout.categoriesfeed_list_item, CategoriesFeedHolder.class, myref); 
    llm = new LinearLayoutManager(rootView.getContext()); 
    llm.setOrientation(LinearLayoutManager.VERTICAL); 

    listCategoriesFeed.setLayoutManager(llm); 
    listCategoriesFeed.setAdapter(categoriesFeedAdapter); 

    swipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh_layout); 
    swipeRefreshLayout.setOnRefreshListener(this); 

    //Holder itemClickListener 
    CategoriesFeedHolder.registerOnItemClickListener(this); 

    //TextView onclick listener 
    View tv = rootView.findViewById(R.id.text); 
    ((TextView)tv).setText("Fragment #" + mNum); 
    tv.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.e("position",mNum + ""); 
     } 
    }); 
    return rootView; 
} 

@Override 
public void onItemClick(View view, int position) { 
super.onItemClick(view, position); 
    switch (view.getId()) { 
     case R.id.firstId: 
      Log.e("position",mNum+ ""); 
      break; 
     case R.id.secondId: 
      secondAction.... 
      ..... 
      ..... 
      ..... 
      break; 
    } 
} 


private void initialize() { 
    controller.showProgressDialog(); 
    list = controller.getIniCategoriesDetailsList(); 
    list.clear(); 
    controller.categoriesDetailsList.put(controller.SELECTED_CATEGORIES[mNum],list); 
    reference = FirebaseDatabase.getInstance().getReference("firebase-path/" + controller.SELECTED_CATEGORIES[mNum]); 
    myref = reference.orderByChild("order-by").limitToFirst(i); 
    myref.addChildEventListener(this); 
} 

CategoriesFeedHolder.java

private CategoriesFeedItem model; 
private final ImageView mImage; 

private static OnItemClickListener onItemClickListener; 

public CategoriesFeedHolder(View itemView) { 
    super(itemView); 
    this.context = itemView.getContext(); 

    mImage = (ImageView) itemView.findViewById(R.id.m_image); 
    mImage.setOnClickListener(this); 
} 

public static void registerOnItemClickListener(OnItemClickListener onItemClickListener) { 
    CategoriesFeedHolder.onItemClickListener = onItemClickListener; 
} 

public void setModel(CategoriesFeedItem model) { 
    this.model = model; 
} 

@Override 
public void onClick(View view) { 
    onItemClickListener.onItemClick(view, getAdapterPosition()); 
} 

有沒有人知道爲什麼會發生這種情況?

+0

你真的應該添加一些代碼..否則將很難幫助你 –

+0

代碼添加...... –

+0

你爲什麼要檢查ItemClickListener中的id與R.id.firstId?在這裏你必須使用位置變量來操作。以及爲什麼onItemClickListener內部持有者類是靜態的? – Harry

回答

0

問題出在viewholder類,裏面沒有數據綁定。所以,當我點擊視圖內的任何項目時,它會對當前適配器的數據(預加載的數據)執行操作。

的viewholder類應該是這樣的:

public ViewHolder(View itemView) { 
    super(itemView); 
    share = (ImageView) itemView.findViewById(R.id.share); 
} 

public void bindToPost(Post post, View.OnClickListener onClickListener) { 
    share.setOnClickListener(onClickListener); 
}