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