在我的應用程式中,我有一個包含3個片段的ViewPager(主頁、簡介和更多)
Home Fragment包含RecyclerView。
當我從Home Fragment導航到Profile Fragment或More Fragment時,它像預期那樣作業。
但是當我導航回到Home Fragment時,RecyclerView中的專案重復了...
而當我再次瀏覽并回傳時,它又重復了
。下面是我的MainActivity.java代碼:
public class MainActivity extends AppCompatActivity {
TabLayout mainTabLayout;
ViewPager mainViewPager。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(s savedInstanceState)。
setContentView(R.layout.activity_main);
mainTabLayout = findViewById(R.id.main_tablayout);
mainViewPager = findViewById(R.id.main_viewpager);
mainTabLayout.setupWithViewPager(mainViewPager)。
//to put mainTabLayout Icons...
MainTabLayoutIcons()。
}
//to Change MainLayout Icons......
private void MainTabLayoutIcons() {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager())。
//將片段添加到配接器中
adapter.addFragment(new Home()。
adapter.addFragment(new MyActivity())。
adapter.addFragment(new More())。
mainViewPager.setOffscreenPageLimit(0)。
mainViewPager.setAdapter(adapter);
//選擇主頁標簽作為啟動時的默認標簽。
mainViewPager.setCurrentItem(0)。
mainTabLayout.getTabAt(0).select()。
//設定標簽的初始圖示。
mainTabLayout.getTabAt(0).setIcon(R.drawable.home_black)。
mainTabLayout.getTabAt(1).setIcon(R.drawable.user_outline)。
mainTabLayout.getTabAt(2).setIcon(R.drawable.more_outline)。
/* tabSelectedListener來改變圖示的顏色,一旦它被選中。
//并在另一個標簽被選中后將其改回 */
mainTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab標簽) {
if (tab.getPosition() == 0) {
mainTabLayout.getTabAt(0).setIcon(R.drawable.home_black)。
mainTabLayout.getTabAt(1).setIcon(R.drawable.user_outline)。
mainTabLayout.getTabAt(2).setIcon(R.drawable.more_outline)。
}
if (tab.getPosition() == 1) {
mainTabLayout.getTabAt(0).setIcon(R.drawable.home_outline)。
mainTabLayout.getTabAt(1).setIcon(R.drawable.user_)。
mainTabLayout.getTabAt(2).setIcon(R.drawable.more_outline)。
}
if (tab.getPosition() == 2) {
mainTabLayout.getTabAt(0).setIcon(R.drawable.home_outline)。
mainTabLayout.getTabAt(1).setIcon(R.drawable.user_outline)。
mainTabLayout.getTabAt(2).setIcon(R.drawable.more_black)。
}
}
@Override[/span
public void onTabUnselected(Tablayout.Tab tab) {
//不需要了。
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//不需要了。
}
});
}
}
而這里是ViewPagerAdapter代碼:
/Adapter for mainActivity ...
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> fragmentList = new ArrayList<> ()。
public ViewPagerAdapter(@NonNull FragmentManager fm) {
super(fm)。
}
@Override
public片段 getItem(int position){
return fragmentList.get(position)。
}
@Override
public int getCount() {
return fragmentList.size()。
}
public void addFragment(Fragment fragment) {
fragmentList.add(fragment)。
}
}
而這里是第一個片段Home.java代碼:
public class Home extends Fragment{
查看v。
public SwipeRefreshLayout mSwipeRefreshLayout;
public RecyclerView mainRecyclerView;
private LinearLayoutManager linearLayoutManager;
public final List<MyActivityModel> mainPosts = new ArrayList<> ()。
private PostAdapter mAdapter;
public Home(){
/*需要空的建構式...。*/
}
@Override
public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle bundle) {
v = layoutInflater.inflate(R.layout.fragment_home, container, false)。
mSwipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.mainSwipeRefresh);
mainRecyclerView = (RecyclerView) v.findViewById(R.id.MainRecyclerView);
linearLayoutManager = new LinearLayoutManager(getActivity())。
mainRecyclerView.setLayoutFrozen(true)。
mainRecyclerView.setNestedScrollingEnabled(false)。
mainRecyclerView.setLayoutManager(linearLayoutManager);
mAdapter = new PostAdapter(mainPosts)。
mainRecyclerView.setAdapter(mAadapter)。
Swipe()。
LoadPosts()。
return v;
}
/**。
* -----------------TODO:在Home RecyclerView中加載帖子...----------------
*/
public void LoadPosts() {
Query database = FirebaseDatabase.getInstance().getReference().child("Post")
database.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
if (snapshot.exists()) {
MyActivityModel post = snapshot.getValue(MyActivityModel.class)。
mainPosts.add(0, post)。
mAdapter.notifyDataSetChanged()。
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
private void Swipe() {
//to refresh page after swipe
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
try {
mainPosts.clear()。
LoadPosts()。
mSwipeRefreshLayout.setRefreshing(false)。
Toast.makeText(v.getContext(),"Refreshed", Toast.LENGTH_SHORT).show()。
} catch (Exception e) {
mSwipeRefreshLayout.setRefreshing(false)。
}
}
}, 500)。)
}
});
}
}
而這是一個顯示專案重吃的圖片
有人能幫助我如何防止這種重復嗎?
uj5u.com熱心網友回復:
你可能需要使用FragmentPagerAdapter而不是FragmentStatePagerAdapter。另外,將mainRecyclerView.setLayoutFrozen(true);設定為false,因為,它將停止recyclerView中的一切。
你什么時候需要使用FragmentPagerAdapter?
FragmentPagerAdapter 的示例:當有大量的頁面時,FragmentStatePagerAdapter更有用。 當有大量的頁面時,FragmentStatePagerAdapter更有用,其作業方式更像一個串列視圖。 當頁面對用戶不可見時,其整個片段可能會被銷毀,只保留該片段的 保存該片段的狀態。這使得尋呼機可以保留 與每個被訪問的頁面相關的記憶體要少得多。 FragmentPagerAdapter,但代價是在頁面之間切換時可能會產生更多的開銷。
FragmentPagerAdapter 的例子
class viewpager_class extends FragmentPagerAdapter {
int tabcount;
public viewpager_class(@NonNull FragmentManager fm, int tab_count) {
super(fm, tab_count)。
this.tabcount = tab_count。
}
@NonNull[/span
@Override
public片段 getItem(int position) {
switch (position) {
case 0:
Fragment1 fragment1 = new Fragment1()。
return todayBAFragment;
case 1:
Fragment2 fragment2 = new Fragment2 ()。
return todayReminderDue;
case 2:
Fragment3 fragment3 = new Fragment3 ()。
return currentTransaction;
default:
return null。
}
@Override; }
public int getCount() {
return tabcount。
}
另外,在你想顯示viewPager的地方將配接器設定為ViewPager:
//set adapter into viewpager。
viewpager_class viewpagerClass = new viewpager_class(getChildFragmentManager(), tabLayout. getTabCount())。
viewPager.setAdapter(viewpagerClass);
viewPager.setOffscreenPageLimit(2)。
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)) 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/318395.html
標籤:
上一篇:對第一個程序的回傳值提出條件
