如何在onBackPressed Android之后避免片段重载

时间:2016-08-23 12:32:00

标签: android fragment

我使用片段在回收站视图中显示车辆列表。 每当用户点击Vehicle时,它会在另一个片段中显示其详细信息, 但是当我按下后退按钮获取其详细信息后我回到车辆列表片段时,车辆列表片段像第一次一样加载。 我在循环器视图中使用了更多的负载。 这就是为什么每当用户滚动得更多并且如果他想要查看车辆的详细信息然后再回到列表时它会像第一次重新加载并且用户获得第一个项目...

车辆列表片段中的

Recycler视图滚动侦听器
rvVehicleList.addOnScrollListener(new EndlessRecyclerViewScrollListener((LinearLayoutManager) rvVehicleList.getLayoutManager()) {
        @Override
        public void onLoadMore(int page, int totalItemsCount) {
            if (!vehicleSearchResponseModel.getData().get_links().getNext().equals("")) {
                pageNo++;
                searchMoreVehicle(pageNo);
            }
        }
    });

回收站视图点击适配器点击车辆信息片段

holder.llMainView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            Bundle bundle = new Bundle();
            bundle.putSerializable("vehicleInfo", vehicleSearchPagerList.get(position));

            VehicleAdInfoFragment vehicleAdInfoFragment = new VehicleAdInfoFragment();
            vehicleAdInfoFragment.setArguments(bundle);
            fragmentTransaction.replace(R.id.frContainer, vehicleAdInfoFragment);
            fragmentTransaction.addToBackStack(vehicleAdInfoFragment.getTag());
            fragmentTransaction.commit();
        }
    });

3 个答案:

答案 0 :(得分:0)

您可以在车辆列表片段中尝试这样的事情:

@Override
public void onPause(){
    super.onPause();
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    SharedPreferences.Editor editor = preferences.edit();
    mCurrentIndex = ((LinearLayoutManager) rvVehicleList.getLayoutManager()).findFirstVisibleItemPosition();
    editor.putInt("current_position", mCurrentIndex);
    editor.apply();
}

@Override
public void onResume(){
    super.onResume();
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    mCurrentIndex = preferences.getInt("current_position", 0);
    rvVehicleList.getLayoutManager().scrollToPosition(mCurrentIndex);
}

答案 1 :(得分:0)

限制片段的重新创建,我做了什么:

onCreateView中,您可以将膨胀的视图存储在全局变量中,只有在null时才对其进行初始化,如下所示:

    var root:View?=null
    var apiDataReceived=false
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    if (root==null)
        root=inflater!!.inflate(R.layout.fragment_layout, container, false)
    return root
}

现在,如果您正在解析某些数据并将其填入RecyclerView或任何其他View

  1. 制作一个全局变量,如上面的代码apiDataReceived

  2. 如果您成功解析数据,请将其设置为true。

  3. 在apiCalls之前设置这样的条件:

    if(!apiDataReceived){ APICALLS() }

  4. 因此,只有在未解析数据时才会调用apiCalls()。

    你是onCreateView之后调用的方法中的http调用和解析或其他任何事情吗onStart

    以上代码在kotlin中,如果您遇到任何问题,请在评论中告诉我。

答案 2 :(得分:0)

一种解决方案是您不需要替换片段,而使用add()方法。 对于我来说,这是唯一避免重新加载先前片段的方法。

fun addFragment(fragment: Fragment) 
{
        val transaction = supportFragmentManager.beginTransaction()
        val currentFragment = supportFragmentManager .findFragmentById(R.id.container)  //get current fragment
        transaction.hide(currentFragment!!)          //hide current fragment
        transaction.add(R.id.container, fragment)    //add next fragment
        transaction.addToBackStack(null)
        transaction.commit()
    }