android - 如何在 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);
}
}
}
解决方案
您可以使用 RecyclerView 装饰器来实现您想要的,而无需接触您的适配器。
看看RecyclerView.ItemDecoration。告诉我您是否需要有关其用法的更多信息。
推荐阅读
- android - Glide 中的图像缓存签名与元数据
- google-sheets - 如何对通过 Google Sheet 中的查询功能获得的数据透视表进行排序
- r - 尝试使用 rbind 时出现数字错误
- asp.net-core - 在 ASP.NET Core 中使用 ValidationMessage 时可以添加或更改默认 CSS 类吗?
- anaconda - Deeplabcut 安装_conda 环境
- apache-spark - 用于 Hbase 扫描的 ColumnPrefixFilter
- apache-spark - 为什么我在 PySpark 中调用 map() 方法时会遇到错误?
- javascript - 如何在 Vuejs 中用一个对象替换另一个对象?界面不变
- python - 如何将腌制的 python 对象导入 Django view.py 文件
- c# - 如何使用自动映射器映射孩子并使用转换