RecyclerView Android Java 中的分页

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

当前有一个列表视图,我在其中展示:

效果很好。 问题是现在我想添加分页,所以我显示 10 个“移动”,然后用箭头或其他东西链接到下一个 10 个“移动”。

这是我的列表视图:

RecyclweView Java:

      RecyclerView lstMovsWallet = (RecyclerView) findViewById(R.id.lstMovsWallet);
             lstMovsWallet.setLayoutManager(new 
             LinearLayoutManager(MovsMobileWallet.this));
             AdapterCobrosPendientesListado adapter = new 
             AdapterCobrosPendientesListado(MovsMobileWallet.this, items);
             lstMovsWallet.setAdapter(adapter);

Adapter for de RecyclerView : 

    public class AdapterCobrosPendientesListado extends RecyclerView.Adapter<AdapterCobrosPendientesListado.ViewHolder> {


    private LayoutInflater mInflater;
    protected List<MovimientoCuenta> items;

    public AdapterCobrosPendientesListado(Context context, List<MovimientoCuenta> data) {
        this.mInflater = LayoutInflater.from(context);
        this.items = data;
    }
    @Override
    public AdapterCobrosPendientesListado.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.activity_adapter_billings_listhistory, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(AdapterCobrosPendientesListado.ViewHolder holder, int position) {
        DecimalFormat formater = new DecimalFormat("###.00");

        String numero =  items.get(position).getNumber();
        String cantidad =  items.get(position).getMonto();
        String fecha =  items.get(position).getFecha();
        String referencia =  items.get(position).getReferencia();
        String debitoCredito = items.get(position).getDebitoCredito();

        holder.number.setText(numero);
        holder.mount.setText(cantidad);
        holder.date.setText(fecha);
        holder.ref.setText(referencia);


        if(debitoCredito.compareTo("DBT")==0){
            holder.title.setText("Pago");
            holder.auxBilling.setImageResource(R.mipmap.signonegativo);
        }
        else {
            holder.title.setText("Cobro");
            holder.auxBilling.setImageResource(R.mipmap.signomas);
        }

    }

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


    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {


        public TextView number;
        public TextView mount;
        public TextView date;
        public ImageView auxBilling;
        public TextView ref;
        public TextView title ;




        public ViewHolder(View itemView) {
            super(itemView);
             number =  itemView.findViewById(R.id.txtNumberPhoneBilling);
             mount =  itemView.findViewById(R.id.txtMountBillingNotifications);
             date =  itemView.findViewById(R.id.txtDateBillingNotifications);
             auxBilling = itemView.findViewById(R.id.btnCancelBillingNotifications);
             ref =  itemView.findViewById(R.id.txtDateBillingRef);
            title =  itemView.findViewById(R.id.TitleMovs);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
          //  if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

 /*   // convenience method for getting data at click position
    public String getItem(int id) {
        return mData.get(id);
    }

    // allows clicks events to be caught
    public void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }*/
}

enter image description here

这里我留下要复制的动作类别:

public class MovimientoCuenta {

private String number;
private String monto;
private String moneda;
private String fecha;
private String ID;
private String referencia ;
private String filtro ;
private String debitoCredito ;
private String nombreMov;

public MovimientoCuenta(String number, String monto, String moneda, String fecha, String ID, String referencia, String filtro, String debitoCredito,String nombreMov) {
    this.number = number;
    this.monto = monto;
    this.moneda = moneda;
    this.fecha = fecha;
    this.ID = ID ;
    this.filtro =filtro;
    this.referencia=referencia;
    this.debitoCredito =debitoCredito;
    this.nombreMov =nombreMov;
}
java android android-recyclerview pagination
1个回答
0
投票

您可以尝试在列表中当前列表的末尾添加另一个数据模型。使该模型的视图类型为按钮。单击此按钮后,您可以使用查询中的偏移量和限制从服务器获取下一组动作。

使泛型类型的列表为 Parcelable,并通过扩展或实现父类型使列表中的所有元素成为子元素。

例如列表可以是 A 类类型

ArrayList<A>

并且里面的元素可以是类型

Class B extends A

Class C extends A

现在在 getView 中,使用运算符实例检查数据类型并膨胀正确的视图布局

If(yourlist.get(positionpassedingetview) instanceof B){
    //Inflate the view for B item if not already inflated
}else{
    //Inflate view of type C
}

对于每次点击上面所说的加载更多项目按钮,使用偏移量作为列表的当前长度减一,并且限制将始终为10。对于第一个查询,使用偏移量为0,否则sql将抛出异常,其余后续查询的偏移量 = 列表大小减一(减一是因为列表的最后一个元素是加载更多按钮而不是实际数据)

例如在 mysql 中,这可能是:

Select * from yourtable where yourcondition order by yourorder limit youroffset,10;

如果没有更多数据,只需更新加载更多的模型,表示不再有项目并禁用按钮。如果您找到更多项目,请将它们插入到最后一个元素(即加载更多按钮)上方的位置,并通知列表适配器。

您必须找到针对这种具有多个视图类型和视图持有者的异构列表视图的教程。这是如何做到这一点的一般想法,我自己将这种方法与具有类似逻辑的回收器视图一起使用

© www.soinside.com 2019 - 2024. All rights reserved.