Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在包含片段的ArrayList中避免重复_Java_Android_Android Fragments_Arraylist_Android Viewpager - Fatal编程技术网

Java 如何在包含片段的ArrayList中避免重复

Java 如何在包含片段的ArrayList中避免重复,java,android,android-fragments,arraylist,android-viewpager,Java,Android,Android Fragments,Arraylist,Android Viewpager,我正在开发一个应用程序,它有一个带有动态片段插入功能的ViewPager,具体取决于用户在片段上按下的按钮 我已经挖掘了两天,寻找一种方法来避免在上述ViewPager中创建重复片段 第一种选择,我尝试: ArrayList.contains(fragment) 并且总是返回false。我搜索了一下,结果发现我必须重写Fragment类中的equals和hashCode方法,但是hashCode被声明为final,所以这里没有运气 第二个选项,为什么不使用LinkedHashMap?我找不到

我正在开发一个应用程序,它有一个带有动态片段插入功能的
ViewPager
,具体取决于用户在片段上按下的按钮

我已经挖掘了两天,寻找一种方法来避免在上述ViewPager中创建重复片段

第一种选择,我尝试:

ArrayList.contains(fragment) 
并且总是返回false。我搜索了一下,结果发现我必须重写Fragment类中的equals和
hashCode
方法,但是
hashCode
被声明为final,所以这里没有运气

第二个选项,为什么不使用
LinkedHashMap
?我找不到像您在
ArrayList.get(index)
上那样从中获取元素的方法,所以我尝试了:

Fragment[] fragments =  LinkedHashMap.toArray() 
重复这个,但是我不能从
对象[]
转换到
片段[]
,我不知道为什么,因为它继承了它

第三种选择

public boolean verifyDuplicates(Fragment f){
   for(Fragment fragment: mFragments){
      if(f.getClass().equals(fragment.getClass()) return true;

   }
}
但是我得到一个“无法解析符号getClass()

第四个选项,获取片段id,如果它与ArrayList中现有片段的任何id匹配,则不添加它。 出于某种原因,如果我第一次创建一个FragmentA two并将其添加到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;
}
公共类ViewPagerAdapter扩展了FragmentStatePagerAdapter{
阵列式多碎片;
语境;
public ViewPagerAdapter(FragmentManager格式、ArrayList MFFragments、上下文){
超级(fm);
this.mFragments=mFragments;
this.context=上下文;
}
公共void setmFragments(ArrayList mFragments){
this.mFragments=mFragments;
}
@凌驾
公共片段getItem(int位置){
返回mFragments.get(位置);
}
@凌驾
public int getCount(){
返回值(MFFragments!=null)?MFFragments.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));
      }
}
公共类deleteDup{
公共ArrayList deleteDup(ArrayList al){
ArrayList alNew=新的ArrayList();
HashSet set=新HashSet(alNew);
对于(T al1:al){
如果(!set.contains(al1)){
alNew.add(al1);
集合。添加(al1);
}
}
返回新的;
}  
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
列表。添加(“A”);
列表。添加(“B”);
列表。添加(“A”);
deleteDup dD=新的deleteDup();
System.out.println(dD.deleteDup(列表));
}
}

第一个选项应该可以工作。不需要实现
hashCode
等于

以下是使用
ArrayList.contains(obj)

结果表明:

getClass() 
方法在执行文件->无效缓存/重新启动并清除+重建后确实有效。


我想Android Studio bug….

使用ArrayList的第一个选项是一个很好的解决方案,可能还有其他错误。你能展示一下你如何使用它的全部代码吗?
private boolean compareDuplicates(Fragment f){
    return mFragments.contains(f);
}
getClass()