Android 当我切换到其他片段并返回到包含recyclerview的片段时,我的recyclerview数据不断翻倍

Android 当我切换到其他片段并返回到包含recyclerview的片段时,我的recyclerview数据不断翻倍,android,Android,我有一个main活动,其中我使用getSupportFragmentManager().beginTransaction.replace()和PositionsFragment替换FrameLayout中的片段,如下所示 当我最初打开PositionFragment时,数据会完美地显示出来,但当我切换到dashboard,然后再次切换到PositionsFragment时,recyclerview中的卡会加倍 每次我换衣服,他们都会翻倍。我尝试使用productList.clear()清除arr

我有一个main活动,其中我使用getSupportFragmentManager().beginTransaction.replace()和PositionsFragment替换FrameLayout中的片段,如下所示

当我最初打开PositionFragment时,数据会完美地显示出来,但当我切换到dashboard,然后再次切换到PositionsFragment时,recyclerview中的卡会加倍

每次我换衣服,他们都会翻倍。我尝试使用productList.clear()清除arrayList;但是没有起作用

MainActivity,我在其中替换片段

case R.id.nav_dashboard:           getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new DashboardFragment()).commit();
                toolbar.setTitle("Dashboard");
                break;
            case R.id.nav_positions:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new PositionsFragment()).commit();
                toolbar.setTitle("Positions");
                break;
位置碎片

public class PositionsFragment extends Fragment{
    public static Spinner spinner;
    RecyclerView recyclerView;
    ProgressBar progressBar;
    ArrayList<Products> productList=new ArrayList<>();
    ArrayList<String> positionsArray;
    FloatingActionButton fab;

    public PositionsFragment() {
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragment_positions, container, false);
        return v;
    }

    @Override
    public void onViewCreated(@NonNull View v, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(v, savedInstanceState);
        fab=v.findViewById(R.id.positionsFab);
        progressBar=v.findViewById(R.id.progressBarPositions);
        progressBar.setVisibility(View.VISIBLE);
        spinner=v.findViewById(R.id.positionsSpinner);
        recyclerView=v.findViewById(R.id.positionsRecyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        productList.clear();
        new fetchDataPositions(new OnPositionsFetched() {
            @Override
            public void OnPositionsFetched() {
                progressBar.setVisibility(View.INVISIBLE);
                positionsArray=fetchDataPositions.getArrayList();
                for (int i=0;i<positionsArray.size();i++){
                    productList.add(new Products(//data));
                }
                final PositionsRecyclerAdapter recyclerAdapter=new PositionsRecyclerAdapter(getActivity(),productList,getActivity());
                recyclerView.setAdapter(recyclerAdapter);
            }
        }).execute(url);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
                R.array.positions_spinner_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
    }
}
公共类位置片段扩展片段{
公共静态微调器;
回收视图回收视图;
ProgressBar ProgressBar;
ArrayList productList=新的ArrayList();
数组列表位置数组;
浮动操作按钮;
公共职位片段(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图v=充气机。充气(右布局。碎片位置,容器,假);
返回v;
}
@凌驾
已创建视图上的公共void(@NonNull View v,@Nullable Bundle savedInstanceState){
super.onViewCreated(v,savedInstanceState);
fab=v.findViewById(R.id.positionsFab);
progressBar=v.findViewById(R.id.progressBarPositions);
progressBar.setVisibility(View.VISIBLE);
微调器=v.findViewById(R.id.positionsSpinner);
recyclerView=v.findViewById(R.id.positionsRecyclerView);
setLayoutManager(新的LinearLayoutManager(getActivity());
productList.clear();
新建fetchDataPositions(新建OnPositionsFetched(){
@凌驾
职位上的公共无效已蚀刻(){
progressBar.setVisibility(View.INVISIBLE);
positionsArray=fetchDataPositions.getArrayList();

对于(int i=0;i查看您的代码,很明显您已将productList保留为类成员,并且只执行了一次productList.clear()。请将该列表保留为本地,或者在fetchDataPositions()回调中的循环之前将其清除。

您可以在适配器构造函数中清除该列表,如下所示:

public PositionsRecyclerAdapter(Context context,ArrayList<Products> productList,Context 
context) {
//local product list in adapter
if(mProductList!=null){
     mProductList.clear();
     mProductList.addAll(productList);
   }

}

当片段被分离时,他的视图被销毁。所以在所描述的情况下,视图被创建两次,onViewCreated被调用两次。如果片段实例被销毁,您需要停止请求数据(这是调用replace时发生的情况)因为现在你将有一个内存泄漏。要正确执行网络请求,你需要有一个没有内存泄漏的对象
连接到片段/活动生命周期轮换重新创建等。例如,您可以启动网络调用并侦听其他保留实例片段的结果。此代码有很多问题,因此,请从了解有关管理片段和片段保留实例的更多信息开始。好的解决方案将是开始使用google arch compoNTS ViewModel。它将帮助您避免犯同样的错误。祝您好运!

尝试了这两种方法,都是一样的result@DivijGupta您尝试了构造函数库还是方法库?@DivijGupta clear positions在获取数据之前也尝试了这种方法。解决了它!我没有在fetchDataPositions函数中清除静态数组。@DivijGupta很高兴听到这个消息你把适配器贴上去了吗?
public void clearProductList(){
   mProductList.clear();
}