Tom Finet
Tom Finet

Reputation: 2136

How to make last list item different to others in android?

I have a recyclerview and an adapter:

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

    private List<PaymentMethod> mPaymentMethods = new ArrayList<>(0);

    public PaymentMethodAdapter(List<PaymentMethod> paymentMethods) {
        mPaymentMethods = paymentMethods;
        int size = mPaymentMethods.size();
        mPaymentMethods.add(size + 1, null);
    }

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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if (mPaymentMethods.get(position) == null) {  // Last item
            // Display add payment method item.

        }
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {

        @Bind(R.id.item_payment_method_image_view) ImageView paymentImageView;
        @Bind(R.id.item_payment_method_card_number_text_view) TextView cardNumberTextView;
        @Bind(R.id.item_current_payment_method_image_view) ImageView currentMethodImageView;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}

I want to make it so that when the last element in mPaymentMethods is reached a different list item layout is used. Basically I want to customize the last item in the list.

How do I customize the last item in a list use a different layout to the other items in the same list?

Thank you.

Upvotes: 2

Views: 54

Answers (1)

ugur
ugur

Reputation: 3654

You should override getItemViewType accordingly as follows.

@Override
public int getItemViewType(int position) {
    return position == mPaymentMethods.size() - 1 ? 1 : 0;
}

Initiate viewholder according to the view type

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
   View view;
   if(viewType == 0){
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_payment_method_list_0, parent, false);
        return new ViewHolder0(view);
   } else {
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_payment_method_list_1, parent, false);
        return new ViewHolder1(view);
   }

}

finally use the chosen layout

 @Override
 public void onBindViewHolder(ViewHolder holder, int position) {
   if (holder instanceOf ViewHolder0){
      //do stuff with layout 0
   } else {
      // do stuff with layout 1
   }        
 }

Upvotes: 3

Related Questions