首页 > 解决方案 > 如何在 recyclerview 中添加一个页脚视图,该视图是从 DB 和反向布局中获取数据

问题描述

目前我有一个从数据库填充的recyclerview。也 recyclerview setreverselayout == true 用于从底部开始的项目。现在我想在我的 recyclerview 中添加一个页脚视图。我已经尝试了一些教程,但仍然没有得到有效的解决方案。任何帮助将不胜感激。

这是我的适配器类

package com.shan.vehicle_maintainance;

import android.animation.Animator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.TranslateAnimation;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class HistoryAdapter extends RecyclerView.Adapter<HistoryAdapter.HistoryViewHolder> {
    private Context context;
    boolean isInserted;
    private List<History> listhistory;
    private DatabaseHelper myDb;
    public HistoryAdapter(Context context, List<History> listhistory) {
        this.context = context;
        this.listhistory = listhistory;
        myDb = new DatabaseHelper(context);
    }
    @Override
    public HistoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.history_list_layout, parent, false);
        return new HistoryViewHolder(view);
    }

    private void changeStateOfItemsInLayout(History historyItem, int p) {
        for (int x = 0; x < listhistory.size(); x++) {
            if (x == p) {
                historyItem.setShouldBeExpanded(true);
                //Since this is the tapped item, we will skip
                //the rest of loop for this item and set it expanded
                continue;
            }
            listhistory.get(x).setShouldBeExpanded(false);
        }
    }

    @Override
    public void onBindViewHolder(final HistoryViewHolder holder, final int position) {
        final History singleHistory = listhistory.get(position);
        holder.txt1.setText(singleHistory.getTxt1());
        holder.txt2.setText(String.valueOf(singleHistory.getTxt2())+" km");
        holder.txt3.setText("Rs."+String.valueOf(singleHistory.getTxt4()));
        String datettime = singleHistory.getTxt3();
        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        Date date = null;
        try {
            date = dt.parse(datettime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        History historyItem = listhistory.get(position);
        if(historyItem.getShouldBeExpanded()){
            expand(holder.expand);
            holder.mainview.setBackgroundResource(0);
        }else{
            collapse(holder.expand);

            //holder.expand2.collapse();
            final int sdk = android.os.Build.VERSION.SDK_INT;
            if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
                holder.mainview.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.cardview_bg) );
            } else {
                holder.mainview.setBackground(ContextCompat.getDrawable(context, R.drawable.cardview_bg));
            }
        }

        // *** same for the format String below
        SimpleDateFormat dt1 = new SimpleDateFormat("yyyy MMM dd");
        holder.txt4.setText(dt1.format(date));

        //View v = holder.layoutManager.findViewByPosition(position)

        int size = listhistory.size() - 1;

        Integer tbltype = singleHistory.getTxt5();
        if (tbltype == 1){
            if (size == position){
                holder.historyimg.setImageResource(R.drawable.fuelhome6top);
            }else
                holder.historyimg.setImageResource(R.drawable.fuelhome6);
        }else if (tbltype == 2){
            if (size == position){
                holder.historyimg.setImageResource(R.drawable.expensehome6top);
            }else
                holder.historyimg.setImageResource(R.drawable.expensehome6);
        }else if (tbltype == 3){
            if (size == position){
                holder.historyimg.setImageResource(R.drawable.servicehome6top);
            }else
                holder.historyimg.setImageResource(R.drawable.servicehome6);
        }

        //holder.expand.setVisibility(View.GONE);

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.expand.isShown()){

                    listhistory.get(holder.getLayoutPosition()).setShouldBeExpanded(false);
                    //holder.expand.setVisibility(View.GONE);
//                    collapse(holder.expand);
//
//                    //holder.expand2.collapse();
//                    final int sdk = android.os.Build.VERSION.SDK_INT;
//                    if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
//                        holder.mainview.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.cardview_bg) );
//                    } else {
//                        holder.mainview.setBackground(ContextCompat.getDrawable(context, R.drawable.cardview_bg));
//                    }
                    //holder.expand2.collapse();
                    // holder.expand.setVisibility(View.GONE);
                    //holder.expand2.setVisibility(View.GONE);
                }else {
                    listhistory.get(holder.getLayoutPosition()).setShouldBeExpanded(true);
                    changeStateOfItemsInLayout(listhistory.get(holder.getLayoutPosition()),holder.getLayoutPosition());
                    // holder.expand.setVisibility(View.VISIBLE);
                    //holder.expand2.setVisibility(View.VISIBLE);
                    //holder.expand.setVisibility(View.VISIBLE);
                    //expand(holder.expand);
                    //holder.mainview.setBackgroundResource(0);

                    //holder.expand2.expand();
                    //holder.expand2.expand();
                }
                notifyDataSetChanged();
            }
        });

        holder.edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //listhistory.get(position).getId();
                Bundle args = new Bundle();
                args.putInt("id", listhistory.get(position).getId());
                Integer tbltype = listhistory.get(position).getTxt5();

                if (tbltype == 1){
                    VehicleHome vehicleHome = (VehicleHome) v.getContext();
                    AddRefuelFrag addRefuelFrag = new AddRefuelFrag();
                    addRefuelFrag.setArguments(args);
                    FragmentTransaction fragmentTransaction_view_refuel = vehicleHome.getSupportFragmentManager().beginTransaction();
                    fragmentTransaction_view_refuel.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.enter, R.anim.exit);
                    fragmentTransaction_view_refuel.replace(R.id.activity_to_do, addRefuelFrag);
                    fragmentTransaction_view_refuel.addToBackStack(null);
                    fragmentTransaction_view_refuel.commit();
                    //Toast.makeText(context, "edit clicked", Toast.LENGTH_SHORT).show();
                }


            }
        });

        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Integer tbltype = listhistory.get(position).getTxt5();

                if (tbltype == 1){
                    AlertDialog.Builder builder = new AlertDialog.Builder(context);
                    builder.setTitle("Delete");
                    builder.setMessage("Are you sure you want to delete?")
                            .setCancelable(false)
                            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    isInserted = myDb.deleteDataRefuel(String.valueOf(listhistory.get(position).getId()));
                                    if (isInserted == true) {
                                        Toast.makeText(context,"item deleted", Toast.LENGTH_SHORT).show();
                                        VehicleHome vehicleHome = (VehicleHome) context;
                                        HistoryFrg historyFrg = new HistoryFrg();
                                        FragmentTransaction fragmentTransaction_history = vehicleHome.getSupportFragmentManager().beginTransaction();
                                        fragmentTransaction_history.replace(R.id.activity_to_do,historyFrg);
                                        //fragmentTransaction_refueling.addToBackStack(null);
                                        fragmentTransaction_history.commit();
                                    }else
                                        Toast.makeText(context, "cannot delete", Toast.LENGTH_SHORT).show();
                                }
                            })
                            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.cancel();
                                }
                            });
                    AlertDialog alert = builder.create();
                    alert.show();
                }
            }
        });

        holder.view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Bundle args = new Bundle();
                args.putInt("id", listhistory.get(position).getId());
                Integer tbltype = listhistory.get(position).getTxt5();

                if (tbltype == 1){
                    VehicleHome vehicleHome = (VehicleHome) v.getContext();
                    RefuelItemViewFrag refuelItemViewFrag = new RefuelItemViewFrag();
                    refuelItemViewFrag.setArguments(args);
                    FragmentTransaction fragmentTransaction_view_refuel = vehicleHome.getSupportFragmentManager().beginTransaction();
                    fragmentTransaction_view_refuel.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.enter, R.anim.exit);
                    fragmentTransaction_view_refuel.replace(R.id.activity_to_do, refuelItemViewFrag);
                    fragmentTransaction_view_refuel.addToBackStack(null);
                    fragmentTransaction_view_refuel.commit();
                }

            }
        });

    }

    public static void expand(View view) {
        view.setVisibility(View.VISIBLE);

        final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        view.measure(widthSpec, heightSpec);

        ValueAnimator mAnimator = slideAnimator(view, 0, view.getMeasuredHeight());
        mAnimator.start();
    }


    public static void collapse(final View view) {
        int finalHeight = view.getHeight();

        ValueAnimator mAnimator = slideAnimator(view, finalHeight, 0);

        mAnimator.addListener(new Animator.AnimatorListener() {

            @Override
            public void onAnimationEnd(Animator animator) {
                view.setVisibility(View.GONE);
            }


            @Override
            public void onAnimationStart(Animator animation) {

            }


            @Override
            public void onAnimationCancel(Animator animation) {

            }


            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
        mAnimator.start();
    }


    private static ValueAnimator slideAnimator(final View v, int start, int end) {

        ValueAnimator animator = ValueAnimator.ofInt(start, end);

        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {

                int value = (Integer) valueAnimator.getAnimatedValue();
                ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
                layoutParams.height = value;
                v.setLayoutParams(layoutParams);
            }
        });
        return animator;
    }


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


    public class HistoryViewHolder extends RecyclerView.ViewHolder {
        public TextView txt1;
        public TextView txt2;
        public TextView txt3;
        public TextView txt4;
        public ImageView historyimg;
        LinearLayout mainview;
        ImageButton edit,delete,view;
        //public ExpandableLayout expand,expand2;
        //public ExpandableRelativeLayout expand,expand2;
        LinearLayout expand;
        public HistoryViewHolder(View itemView) {
            super(itemView);
            txt1 = (TextView)itemView.findViewById(R.id.txt1);
            txt2 = (TextView)itemView.findViewById(R.id.txt2);
            txt3 = (TextView)itemView.findViewById(R.id.txt3);
            txt4 = (TextView)itemView.findViewById(R.id.txt4);
            historyimg = (ImageView)itemView.findViewById(R.id.imghistory);
            //expand = (ExpandableLayout)itemView.findViewById(R.id.expand);
            //expand2 = (ExpandableLayout)itemView.findViewById(R.id.expand2);
            mainview = (LinearLayout)itemView.findViewById(R.id.mainview);
            expand = (LinearLayout)itemView.findViewById(R.id.expand);
            edit = (ImageButton) itemView.findViewById(R.id.btnedit);
            delete = (ImageButton) itemView.findViewById(R.id.btndelete);
            view = (ImageButton) itemView.findViewById(R.id.btnview);


        }
    }


}

标签: androidandroid-recyclerview

解决方案


您可以使用 RecyclerView 装饰器来实现您想要的,而无需接触您的适配器。

看看RecyclerView.ItemDecoration。告诉我您是否需要有关其用法的更多信息。


推荐阅读