【发布时间】:2019-03-02 14:15:48
【问题描述】:
在回收站视图中滑动时,我试图从 firebase 中删除 arow。我已经设法从回收站视图中删除了该记录,但正在努力从 Firebase 中删除它。以下是我目前正在使用的,在 deleteItem() 方法(在 getSnapshots() 方法上(无法解析方法 'getSnapshots()')的 adpater 中出现错误。
我在回收站视图中使用 Item touch helper 的活动:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_customer_profile);
Log.d(TAG, "finding recyclerview");
recyclerView = (RecyclerView) findViewById(R.id.myRecyclerBooking);
recyclerView.setLayoutManager( new LinearLayoutManager(this));
Log.d(TAG, "getting db reference");
//FirebaseSearch https://www.youtube.com/watch?v=b_tz8kbFUsU
reference = FirebaseDatabase.getInstance().getReference().child("Booking");
Query firebaseSearchQuery = reference.orderByChild("customerID").equalTo(mAuth.getCurrentUser().getUid());
firebaseSearchQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Log.d(TAG, "populating recyclerview");
list = new ArrayList<Booking>();
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
Booking b = dataSnapshot1.getValue(Booking.class);
list.add(b);
}
adapter = new MyAdapterBookings(CustomerProfile.this, list);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(CustomerProfile.this, "Opsss.... Something is wrong", Toast.LENGTH_SHORT).show();
}
});
}
ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this);
new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);
ItemTouchHelper.SimpleCallback itemTouchHelperCallback1 = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.UP) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// Row is swiped from recycler view
// remove it from adapter
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
};
// attaching the touch helper to recycler view
new ItemTouchHelper(itemTouchHelperCallback1).attachToRecyclerView(recyclerView);
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) {
if (viewHolder instanceof MyAdapterBookings.MyViewHolder) {
// get the removed item name to display it in snack bar
String name = list.get(viewHolder.getAdapterPosition()).getMuaName();
// backup of removed item for undo purpose
final Booking deletedItem = list.get(viewHolder.getAdapterPosition());
final int deletedIndex = viewHolder.getAdapterPosition();
// remove the item from recycler view
adapter.removeItem(viewHolder.getAdapterPosition());
adapter.deleteItem(viewHolder.getAdapterPosition());
// showing snack bar with Undo option
Snackbar snackbar = Snackbar
.make(coordinatorLayout, "Appointment with " + name + " cancelled!", Snackbar.LENGTH_LONG);
snackbar.setAction("UNDO", new View.OnClickListener() {
@Override
public void onClick(View view) {
// undo is selected, restore the deleted item
adapter.restoreItem(deletedItem, deletedIndex);
}
});
snackbar.setActionTextColor(Color.YELLOW);
snackbar.show();
}
}
我的适配器:
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class MyAdapterBookings extends RecyclerView.Adapter<MyAdapterBookings.MyViewHolder> {
Context context;
ArrayList<Booking> bookings;
DatabaseReference reference;
private static final String TAG = "Bookings Adapter";
public MyAdapterBookings(Context c , ArrayList<Booking> b)
{
context = c;
bookings = b;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.bookingview,parent,false));
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.name.setText(bookings.get(position).getMuaName());
holder.date.setText(bookings.get(position).getDate());
holder.time.setText(bookings.get(position).getTime());
holder.price.setText(bookings.get(position).getPrice());
holder.location.setText(bookings.get(position).getLocation());
}
@Override
public int getItemCount() {
return bookings.size();
}
class MyViewHolder extends RecyclerView.ViewHolder
{
TextView name,date,time,price,location;
public RelativeLayout viewBackground, viewForeground;
public MyViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
date = (TextView) itemView.findViewById(R.id.date);
time = (TextView) itemView.findViewById(R.id.time);
price = (TextView) itemView.findViewById(R.id.price);
location = (TextView) itemView.findViewById(R.id.location);
viewBackground = itemView.findViewById(R.id.view_background);
viewForeground = itemView.findViewById(R.id.view_foreground);
} }
public void removeItem(int position) {
bookings.remove(position);
// notify the item removed by position
// to perform recycler view delete animations
// NOTE: don't call notifyDataSetChanged()
notifyItemRemoved(position);
}
public void deleteItem(int position){
getSnapshots().getSnapshot(position).getReference().delete();
}
public void restoreItem(Booking item, int position) {
bookings.add(position, item);
// notify item added by position
notifyItemInserted(position);
}
}
【问题讨论】:
-
getSnapshots()应该做什么? -
它应该获取文档引用。我按照本教程youtube.com/watch?v=dTuhMFP-a1g 解决了我的问题,但该行似乎引发了错误。
-
该教程使用来自FirebaseUI 库的适配器,而您似乎正在构建自己的适配器。
getSnapshot(position)来自 FirebaseUI。我在下面写了一个关于如何在您的情况下执行此操作的答案,这类似于 FirebaseUI 的操作方式。
标签: android firebase firebase-realtime-database