我的问题是当我在回收视图中滚动数据时,所以加载了新数据,但问题是当新数据加载时,回收视图从第一个产品开始,
我需要保持旧的位置,只滚动新数据,而不滚动所有旧数据
目前,我正在添加文件adeptoer文件和主文件的完整代码,
public class adepter extends RecyclerView.Adapter<adepter.viewholder> { private Context mCtx; private List<Product> productList; public adepter(Context mCtx, List<Product> productList) { this.mCtx = mCtx; this.productList = productList; } @NonNull @Override public adepter.viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { LayoutInflater inflater=LayoutInflater.from(mCtx); View v =inflater.inflate(R.layout.product_list, parent, false); final viewholder vh = new viewholder(v); vh.itemView.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Product product = productList.get(vh.getAdapterPosition()); //do the page opening here Intent intent = new Intent(mCtx, product_info.class); intent.putExtra("id",product.getId()); mCtx.startActivity(intent); } }); return vh; } @Override public void onBindViewHolder(@NonNull adepter.viewholder holder, int position) { Product product = productList.get(position); //loading the image Glide.with(mCtx) .load(product.getImage()) .into(holder.imageView); holder.textViewTitle.setText(product.getTitle()); holder.textViewShortDesc.setText(product.getShortdesc()); holder.textViewtype.setText(String.valueOf(product.getType())); holder.textViewPrice.setText("Rs: "+String.valueOf(product.getPrice())); } @Override public int getItemCount() { return productList.size(); } public class viewholder extends RecyclerView.ViewHolder{ TextView textViewTitle, textViewShortDesc, textViewtype, textViewPrice; ImageView imageView; public viewholder(@NonNull View itemView) { super(itemView); textViewTitle = itemView.findViewById(R.id.textViewTitle); textViewShortDesc = itemView.findViewById(R.id.textViewShortDesc); textViewtype = itemView.findViewById(R.id.textViewRating); textViewPrice = itemView.findViewById(R.id.textViewPrice); imageView = itemView.findViewById(R.id.imageView); } } } public class home extends AppCompatActivity { //a list to store all the products List<Product> productList; //the recyclerview RecyclerView recyclerView; ProgressBar Pbar; GridLayoutManager manager; int token = 1; Boolean isScrolling = false; int currentItems, totalItems, scrollOutItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); Pbar = findViewById(R.id.progressBar1); //getting the recyclerview from xml recyclerView = findViewById(R.id.recylcerView); recyclerView.setHasFixedSize(true); manager = new GridLayoutManager(this, 2); recyclerView.setLayoutManager(manager); //initializing the productlist productList = new ArrayList<>(); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if(newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { isScrolling = true; } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); currentItems = manager.getChildCount(); totalItems = manager.getItemCount(); scrollOutItems = manager.findFirstVisibleItemPosition(); if(isScrolling && (currentItems + scrollOutItems == totalItems)) { isScrolling = false; token++; getData(); } } }); getData(); } private void getData(){ String url = "https://shop.com/index.php"; url = url+ "&pg="+ String.valueOf(token); Pbar.setVisibility(View.VISIBLE); StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { // Toast.makeText(getApplicationContext(),"volly ok ",Toast.LENGTH_LONG).show(); try { //converting the string to json array object JSONArray array = new JSONArray(response); //traversing through all the object for (int i = 0; i < array.length(); i++) { //getting product object from json array JSONObject product = array.getJSONObject(i); //adding the product to product list productList.add(new Product( product.getInt("id"), product.getString("title"), product.getString("shortdesc"), product.getString("type"), product.getString("price"), product.getString("image") )); } // Toast.makeText(getApplicationContext(),productList+ "volly ok ",Toast.LENGTH_LONG).show(); adepter a = new adepter(home.this, productList); recyclerView.setAdapter(a); Pbar.setVisibility(View.GONE); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getApplicationContext(), "Server Error" ,Toast.LENGTH_LONG).show(); } }); //adding our stringrequest to queue Volley.newRequestQueue(this).add(stringRequest); } }
试试这个:
public class home extends AppCompatActivity { //a list to store all the products List<Product> productList; //the recyclerview RecyclerView recyclerView; adepter a; ProgressBar Pbar; GridLayoutManager manager; int token = 1; Boolean isScrolling = false; int currentItems, totalItems, scrollOutItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); Pbar = findViewById(R.id.progressBar1); //getting the recyclerview from xml recyclerView = findViewById(R.id.recylcerView); recyclerView.setHasFixedSize(true); manager = new GridLayoutManager(this, 2); recyclerView.setLayoutManager(manager); //initializing the productlist productList = new ArrayList<>(); a = new adepter(home.this, productList); recyclerView.setAdapter(a); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if(newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { isScrolling = true; } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); currentItems = manager.getChildCount(); totalItems = manager.getItemCount(); scrollOutItems = manager.findFirstVisibleItemPosition(); if(isScrolling && (currentItems + scrollOutItems == totalItems)) { isScrolling = false; token++; getData(); } } }); getData(); } private void getData(){ String url = "https://shop.com/index.php"; url = url+ "&pg="+ String.valueOf(token); Pbar.setVisibility(View.VISIBLE); StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { // Toast.makeText(getApplicationContext(),"volly ok ",Toast.LENGTH_LONG).show(); try { //converting the string to json array object JSONArray array = new JSONArray(response); //traversing through all the object for (int i = 0; i < array.length(); i++) { //getting product object from json array JSONObject product = array.getJSONObject(i); //adding the product to product list productList.add(new Product( product.getInt("id"), product.getString("title"), product.getString("shortdesc"), product.getString("type"), product.getString("price"), product.getString("image") )); } a.notifyDataSetChanged(); Pbar.setVisibility(View.GONE); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getApplicationContext(), "Server Error" ,Toast.LENGTH_LONG).show(); } }); //adding our stringrequest to queue Volley.newRequestQueue(this).add(stringRequest); } }