Recyclerview滚动在动态数据分页中自动上升(顶部)

问题描述 投票:0回答:1

我正在使用分页样式从recyclerView中的本地服务器中获取数据,即在完成首页项后获取下一页。我走了很远,但遇到了到达下一页时自动滚动到顶部的问题,依此类推。这是片段的代码

public class AVehicleFragment extends Fragment {
Button btnsearch;
RequestQueue requestQueue;
StringRequest stringRequest;
List<Vehicleinfo> vehicleinfos;
RecyclerView recyclerView;
VehiclelistAdapter vehiclelistAdapter;
LinearLayoutManager layoutManager;
int PAGE_SIZE = 20;
int PAGE_NUMBE= 1;
int currentitem,totalitem,scrolleditem;
//RecyclerView.LayoutManager layoutManager;
boolean isScrolling = false;
ProgressBar progressBar;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_avehicle, container, false);
    btnsearch = view.findViewById(R.id.btnsearch);
    progressBar = view.findViewById(R.id.progressbar);
    vehicleinfos = new ArrayList<>();
    recyclerView = view.findViewById(R.id.rvvehilelist);
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                isScrolling = true;
                recyclerView.scrollToPosition(scrolleditem);
                Log.d(TAG, "onScrollStateChanged: ");
            }


        }

        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            currentitem = layoutManager.getChildCount();
            scrolleditem = layoutManager.findFirstVisibleItemPosition();
            totalitem = layoutManager.getItemCount();
            if (isScrolling &&(currentitem + scrolleditem==totalitem)){
                isScrolling=false;
                fetchData();
              //  recyclerView.scrollToPosition(scrolleditem);
                Log.d(TAG, "onScrollStateChanged: ");
            }


        }
    });

    layoutManager = new LinearLayoutManager(getContext());
    readInitialvehicle(PAGE_SIZE,PAGE_NUMBE);
    recyclerView.scrollToPosition(scrolleditem);
    return view;
}

public void readInitialvehicle(int pagesize, int pagenum){

    requestQueue = Volley.newRequestQueue(getContext());
    String url = MConstant.URL+MConstant.VEHICLEPAGESIZE+pagesize+MConstant.VEHICLEPAGENUMBER+pagenum;

    stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONArray jsonArray = new JSONArray(response);
                for (int i =0;i<jsonArray.length();i++){
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    String vehiclenum = jsonObject.getString("VehicleNumber");
                    String owner = jsonObject.getString("Owner");
                    String driver = jsonObject.getString("Driver");
                    String vehicletype = jsonObject.getString("VehicleType");
                    String registrationfee = jsonObject.getString("RegistrationFee");
                    String vehicleengine = jsonObject.getString("EngineType");
                    String balance = jsonObject.getString("LatestBalance");
                    String vehicleid = jsonObject.getString("VehicleId");

                    Vehicleinfo vehicleinfo = new Vehicleinfo(owner,driver,vehiclenum,vehicletype,registrationfee,vehicleengine,balance,vehicleid);
                    vehicleinfos.add(vehicleinfo);

                }
                vehiclelistAdapter = new VehiclelistAdapter(vehicleinfos);
                recyclerView.setLayoutManager(layoutManager);
                recyclerView.setAdapter(vehiclelistAdapter);
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d(TAG, "onErrorResponse: ");

        }
    });


    requestQueue.add(stringRequest);

}

public void fetchData(){
    progressBar.setVisibility(View.VISIBLE);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            PAGE_SIZE= PAGE_SIZE+20;
            PAGE_NUMBE=PAGE_NUMBE+1;
            readInitialvehicle(PAGE_SIZE,PAGE_NUMBE);
            progressBar.setVisibility(View.GONE);


        }
    },3000);
}

}

这里是Recyclerview适配器类

public class VehiclelistAdapter extends RecyclerView.Adapter<VehiclelistAdapter.ViewHolder> {
List<Vehicleinfo> vehicleinfos;

public VehiclelistAdapter(List<Vehicleinfo> vehicleinfos) {
    this.vehicleinfos = vehicleinfos;
}

@NonNull
@Override
public VehiclelistAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_vehiclelist_fragment,parent,false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull VehiclelistAdapter.ViewHolder holder, final int position) {
    final Vehicleinfo vehicleinfo = vehicleinfos.get(position);
    String vehiclenum = vehicleinfo.getVehiclenum();
    String owner = vehicleinfo.getOwner();
    String driver = vehicleinfo.getDriver();
    String sn = String.valueOf(position+1);
    holder.tvvehiclenum.setText(vehiclenum);
    holder.tvowner.setText(owner);
    holder.tvdriver.setText(driver);

    holder.tvsn.setText(sn);
    if (position%2 ==1){
        holder.itemView.setBackgroundColor(Color.parseColor("#D3B3E2"));
    }
    else {
        holder.itemView.setBackgroundColor(Color.parseColor("#FFFFFF"));
    }

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Bundle bundle = new Bundle();
            String vehicletype = vehicleinfo.getVehicletype();
            String registrationfee = vehicleinfo.getRegistrationfee();
            String enginetype = vehicleinfo.getVehicleengine();
            String balance = vehicleinfo.getBalance();
            String vehiclenumber = vehicleinfo.getVehiclenum();
            String vehicleid = vehicleinfo.getVehicleid();


            bundle.putString("vehicletype",vehicletype);
            bundle.putString("registrationfee",registrationfee);
            bundle.putString("enginetype",enginetype);
            bundle.putString("balance",balance);
            bundle.putString("vehiclenumber",vehiclenumber);
            bundle.putString("vehicleid",vehicleid);

            AVehicledetailFragment vehicledetailFragment = new AVehicledetailFragment();
            vehicledetailFragment.setArguments(bundle);

            AppCompatActivity appCompatActivity = (AppCompatActivity) v.getContext();
            appCompatActivity.getSupportFragmentManager().beginTransaction().replace(R.id.fcontainer,vehicledetailFragment).addToBackStack(null).commit();

        }
    });

}

@Override
public int getItemCount() {
    return vehicleinfos.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView tvsn,tvvehiclenum,tvowner,tvdriver;
    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        tvsn = itemView.findViewById(R.id.tvsn);
        tvdriver = itemView.findViewById(R.id.tvdrivername);
        tvowner = itemView.findViewById(R.id.tvownername);
        tvvehiclenum = itemView.findViewById(R.id.tvvehiclenum);
    }
}

}

最初,它获取第一页数据,滚动后获取第二页数据并显示在其占位符中,但是recyclerView会自动滚动到顶部。我也选择这里的其他答案,但这并没有帮助我。 请不要对此问题投反对票

java android android-recyclerview
1个回答
0
投票

而不是使用:

scrolleditem = layoutManager.findFirstVisibleItemPosition();

使用此:

scrolleditem = ((LinearLayoutManager)recyclerView.GetLayoutManager()).FindFirstVisibleItemPosition();
© www.soinside.com 2019 - 2024. All rights reserved.