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()