![](/img/trans.png)
[英]How to remove duplicates ArrayList from an ArrayList of ArrayList
[英]How to avoid duplicates in ArrayList containing Fragments
我正在開發一個具有帶有動態Fragment插入的ViewPager
的應用程序,具體取決於用戶在女巫Fragment上按下的內容。
我已經花了兩天的時間來尋找避免在ViewPager中創建重復的Fragment的方法。
第一種選擇,我嘗試過:
ArrayList.contains(fragment)
並始終返回false。 我搜索了一下,結果發現我必須重寫Fragment類中的equals和hashCode
方法,但是hashCode
被聲明為final,所以沒有運氣。
第二種選擇,為什么不使用LinkedHashMap
呢? 我找不到像在ArrayList.get(index)
上那樣從中獲取元素的方法,所以我嘗試了:
Fragment[] fragments = LinkedHashMap.toArray()
並對此進行迭代,但是我無法從Object[]
為Fragment[]
,我不知道為什么,因為它是從它繼承的。
第三選擇
public boolean verifyDuplicates(Fragment f){
for(Fragment fragment: mFragments){
if(f.getClass().equals(fragment.getClass()) return true;
}
}
但是我得到一個“ 無法解析符號getClass() ”。
第四個選項,獲取Fragment ID,如果它與ArrayList中現有Fragment的任何ID相匹配,則不要添加它。 好吧,由於某種原因,如果我第一次創建一個FragmentA,然后將其添加到ArrayList中,然后創建第二個FragmentA,並比較它們的ID,它們是完全不同的,因此將其添加。 但是,如果我創建第三個FragmentA,則其ID與第二個FragmentA ID相匹配,因此我最終會得到兩個重復的FragmentA。(第一個和第二個)
無論如何,這是代碼...有沒有辦法識別片段? 一種確保沒有重復的方法?
謝謝
插入新片段的方法:
private void nextView(View v){
Log.d("onViewSwipe", String.valueOf(v.getId()));
Fragment f = getNextFragment(v.getId());
if(f == null){
Log.e("FRAGMENT", "NULL");
}
else{
Log.e("FRAGMENT", f.toString());
}
/*Verify that that page doesnt already exist*/
if(!compareDuplicates(f)) {
Log.d("FRAGMENT", "DOESNT EXISTS");
mFragments.add(f);
mViewPagerAdapter.notifyDataSetChanged();
mViewPager.setCurrentItem(mFragments.size()-1);
}
}
比較它們的方法:
private boolean compareDuplicates(Fragment f){
for(Fragment fragment: mFragments){
int idF = f.getId(); //for debugging
int idFrag = fragment.getId(); //for debugging
if(f.getId() == fragment.getId()){
return true;
}
}
return false;
}
ViewPagerAdapter:
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
ArrayList<Fragment> mFragments;
Context context;
public ViewPagerAdapter(FragmentManager fm, ArrayList<Fragment> mFragments, Context context) {
super(fm);
this.mFragments = mFragments;
this.context = context;
}
public void setmFragments(ArrayList<Fragment> mFragments) {
this.mFragments = mFragments;
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return (mFragments != null) ? mFragments.size():0;
}
附加信息:
主機活動處理每個片段都相同的回調,由包含觸發新片段插入的按鈕或元素的片段調用。 該回調調用nextView(v)
我不確定這是否是最好的解決方案,盡管它可以工作。
public class deleteDup<T> {
public ArrayList<T> deleteDup(ArrayList<T> al) {
ArrayList<T> alNew=new ArrayList<>();
HashSet<T> set = new HashSet<>(alNew);
for (T al1 : al) {
if (!set.contains(al1)) {
alNew.add(al1);
set.add(al1);
}
}
return alNew;
}
public static void main(String[] args){
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("A");
deleteDup<String> dD=new deleteDup<>();
System.out.println(dD.deleteDup(list));
}
}
第一個選項應該使其工作。 無需實現hashCode
或equals
。
以下是使用ArrayList.contains(obj)
的示例
ArrayList<Fragment> list = new ArrayList<Fragment>();
Fragment f1 = new Fragment();
Fragment f2 = new Fragment();
list.add(f1);
if(!list.contains(f2)){
Log.d("Main", "contains no f2");
}
if(list.contains(f1)){
Log.d("Main", "contains f1");
}
這兩個日志都將打印。
因此,您可以像下面這樣更改compareDuplicates
,
private boolean compareDuplicates(Fragment f){
return mFragments.contains(f);
}
原來是:
getClass()
方法在執行File-> Invalidate Caches /重新啟動並清理+重建后確實起作用。
我猜是Android Studio錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.