如何避免包含Fragments的ArrayList中的重复项

时间:2015-04-11 04:56:52

标签: java android android-fragments arraylist android-viewpager

我正在开发一个具有动态片段插入ViewPager的应用,具体取决于用户对女性Fragment的压制。

我已经挖了两天寻找避免在所述ViewPager中创建重复片段的方法。

第一个选项,我试过了:

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)

3 个答案:

答案 0 :(得分:0)

我不确定这是否是最佳解决方案,尽管它有效。

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));
      }
}

答案 1 :(得分:0)

第一个选项应该使它工作。无需实施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);
}

答案 2 :(得分:0)

原来是:

getClass() 

方法在执行文件 - &gt;后确实有效使高速缓存/重新启动无效并清理+重建。

Android Studio我猜错..