簡體   English   中英

如何避免在包含片段的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));
      }
}

第一個選項應該使其工作。 無需實現hashCodeequals

以下是使用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錯誤。

如何在 ArrayList 中查找重復項<object> ?<div id="text_translate"><p> 這是一個很常見的問題,但我找不到這部分:</p><p> 假設我有這個數組列表:</p><pre> List&lt;MyDataClass&gt; arrayList = new List&lt;MyDataClass&gt;; MyDataClass{ String name; String age; }</pre><p> 現在,我需要根據MyDataClass中的age查找重復項並將其刪除。 如何使用<a href="http://www.javadb.com/remove-duplicate-items-from-an-arraylist" rel="nofollow">此處</a>描述的 HashSet 之類的東西?</p><p> 我想,我們需要覆蓋 MyDataClass 中的equals嗎?</p><ol><li> 但是,如果我沒有這樣做的奢侈呢?</li><li> 而HashSet實際上是如何在內部找到並且不添加重復項的? 我<a href="http://www.google.com/codesearch#TTY8xLpnKOE/src/share/classes/java/util/HashSet.java&amp;q=HashSet&amp;type=cs&amp;l=103" rel="nofollow">在 OpenJDK 中</a>看到了它的實現,但無法理解。</li></ol></div></object>

[英]How to find duplicates in an ArrayList<Object>?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 如何從 ArrayList 的 ArrayList 中刪除重復的 ArrayList 如何不將重復項添加到arrayList 如何防止對象ArrayList中的重復項 如何在 ArrayList 中查找重復項<object> ?<div id="text_translate"><p> 這是一個很常見的問題,但我找不到這部分:</p><p> 假設我有這個數組列表:</p><pre> List&lt;MyDataClass&gt; arrayList = new List&lt;MyDataClass&gt;; MyDataClass{ String name; String age; }</pre><p> 現在,我需要根據MyDataClass中的age查找重復項並將其刪除。 如何使用<a href="http://www.javadb.com/remove-duplicate-items-from-an-arraylist" rel="nofollow">此處</a>描述的 HashSet 之類的東西?</p><p> 我想,我們需要覆蓋 MyDataClass 中的equals嗎?</p><ol><li> 但是,如果我沒有這樣做的奢侈呢?</li><li> 而HashSet實際上是如何在內部找到並且不添加重復項的? 我<a href="http://www.google.com/codesearch#TTY8xLpnKOE/src/share/classes/java/util/HashSet.java&amp;q=HashSet&amp;type=cs&amp;l=103" rel="nofollow">在 OpenJDK 中</a>看到了它的實現,但無法理解。</li></ol></div></object> 如何從 arraylist 中刪除重復項 如何查找包含Object的ArrayList 如何避免Java中的方法重載以避免重復? 如何避免與 JPA 級聯重復? 如何在內部避免重復? 如何避免在ArrayList中使用2個線程的NullPointerException
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM