当我切换到其他片段并返回到具有回收器视图的片段时,我的回收器视图数据不断加倍

  • 本文关键字:视图 片段 数据 返回 其他 android
  • 更新时间 :
  • 英文 :


我有一个 MainActivity,我使用 getSupportFragmentManager((.beginTransaction.replace(( 和 PositionFragment 替换 FrameLayout 中的片段,如下所示。

当我最初打开 PositionFragment 时,数据会完美显示,但是当我切换到仪表板然后再次切换到 PositionFragment 时,回收器视图中的卡片会翻倍。

每次我切换时,它们都会加倍。我尝试使用 productList.clear(( 清除数组列表;但没有用。

我替换片段的主要活动。

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);
}
}

可以将适配器构造函数中的列表清除为:

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

或者可以在适配器中创建方法并在添加新数据之前调用它。

public void clearProductList(){
mProductList.clear();
}

查看您的代码,很明显您已将 productList 保留为类成员,并且只执行了一次 productList.clear((;要么将列表保留在本地,要么在 fetchDataPosition(( 回调中的循环之前清除它。

当碎片分离时,他的视图被破坏。因此,在所描述的情况下,您的视图被创建两次,onViewCreated 被调用两次。如果片段实例被销毁,您需要停止请求数据(这是调用 replace 时发生的情况(,因为现在您将有内存泄漏。要正确执行网络请求,您需要有一些尚未执行的对象 与片段/活动生命周期轮换重新创建等相关联。例如,您可以启动网络调用并侦听来自其他保留实例片段的结果。这段代码有很多问题,所以从学习更多关于管理片段和片段保留实例开始。好的解决方案是开始使用谷歌架构组件ViewModel。它将帮助您避免犯同样的错误。祝你好运!

相关内容

最新更新