我正在开发一个具有动态片段插入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)
答案 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)
第一个选项应该使它工作。无需实施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);
}
答案 2 :(得分:0)
原来是:
getClass()
方法在执行文件 - &gt;后确实有效使高速缓存/重新启动无效并清理+重建。
Android Studio我猜错..