我如何对 recyclerview 应用限制?

how can i apply limit to recyclerview?

我想对 recyclerview 应用限制,只在其中显示 5 个结果,并在列表末尾显示一个用于转到另一个地方的按钮?!

我的代码在下面;

适配器代码:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.Holder> {

ArrayList<Products> ProductsList;
Context context;

public ProductAdapter(ArrayList<Products> productsList, Context context) {
    ProductsList = productsList;
    this.context = context;
}

@NonNull
@Override
public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(context).inflate(R.layout.row_layout_horizental, parent, false);
    return new Holder(v);
}

@Override
public void onBindViewHolder(@NonNull Holder holder, int position) {

    Products products = ProductsList.get(position);

    holder.txtName.setText(products.getName());
    holder.txtPrice.setText(products.getPrice());
    Picasso.get().load(Config.ip_value + "/images/" + products.getPhoto()).into(holder.imgV);

}

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

public class Holder extends RecyclerView.ViewHolder {

    TextView txtName;
    TextView txtPrice;
    ImageView imgV;

    public Holder(@NonNull View itemView) {
        super(itemView);
        txtName = itemView.findViewById(R.id.rowTxtProductName);
        txtPrice = itemView.findViewById(R.id.rowTxtPrice);
        imgV = itemView.findViewById(R.id.rowImgProduct);
    }
}
}

我在主要片段中有一些代码,但我认为没有必要放在这个地方,但如果你想看到它们,请发表评论,我会把所有代码都放在更新文本中

谢谢

您可以在将 list 传递给 RecyclerView 之前将 list 切片为仅包含 5 项,或者只需将 Adapter 中的 getItemCount 方法更改为 return 5

@Override
public int getItemCount() {
    return ProductsList.size() > 5 ? 5 : ProductsList.size();
}

您可以使用 getItemCount() 设置限制为

@Override
public int getItemCount() {
    return 5;
}

通过另一个地方,如果你的意思是其他 activity 或片段,然后放置 xml 文件中 recyclerview 布局末尾的按钮。

例如:如果使用 RelativeLayout,

                  <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent">

                        <androidx.recyclerview.widget.RecyclerView
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_alignParentTop="true"
                            android:id="@+id/recyclerview"/>
                        <Button
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:text="Next"
                            android:layout_alignParentBottom="true"
                            android:layout_below="@+id/recyclerview"
                            android:id="@+id/btn_next"/>
                        
                    </RelativeLayout>

然后单击按钮,您可以调用意图或类似内容以转到您的页面

您可以在 ProductsList 中设置限制查询 API。 如果您使用的是 retrofit2

您可以在 API 界面中定义限制参数,如果该选项在您的后端服务器中有,

@GET("products")
Call<Products> getProducts(@Query("limit") int limit);

并在你的 activity class 中定义你传递 setAdapter 的方法,如下所示

   public void getProducts(int limit){

    Call<Products> call = yourAPI.getProducts(limit);

    call.enqueue(new Callback<Products>() {
        @Override
        public void onResponse(Call<Products> call, Response<Products> response) {
            if (response.isSuccessful() && response.body() != null) {
                ArrayList<Products> products = response.body();
                if (products == null) products = new ArrayList<>();
                productsAdapter.setData(products); // setData needs to be defined in your adapter

            } else {
                Toast.makeText(yourActivity.this, "Server Error", Toast.LENGTH_SHORT).show(); 
            }
        }

        @Override
        public void onFailure(Call<Products> call, Throwable t) {
            if(t.getMessage() != null) Log.e("ErrorTag", t.getMessage());
            Toast.makeText(yourActivity.this, "Server Error", Toast.LENGTH_SHORT).show();
            }
    });

不要忘记定义名为 setData 的新方法,

public void setData(ArrayList<Products> productsList) {
    this.ProductsList.addAll(productsList);
    notifyDataSetChanged();
};

要获得其他 5 种产品,我不建议您创建下一个或上一个按钮, 最好在适配器的 onBindViewHolder 方法中添加下面的代码,以便在用户滚动到最后一项时加载另外 5 个产品,

   if (position == (ProductsList.size() - 1)){
        if (context instanceof YourActivity){
            YourActivity activity = (YourActivity) context;
            activity.getProducts(ProductsList.size());
        }
    }