使用 FirebaseUI 将子集合中的数据放入第二个布局中

Putting data from a subcollection in a second Layout with FirebaseUI

我想在新的 RecyclerView 中打开 Firebase 子集合的数据。 Main Activity 有一个 RecyclerView,其中填充了第一个集合中的数据,第二个 activity 应该通过单击 items.This 第二个 activity 中的一个打开第二个 RecyclerView。我的主 Activity 工作正常,我可以看到我所有的数据。但是当我点击其中一项时,我的应用程序崩溃了。

这是我的主Activity

private FirebaseFirestore db = FirebaseFirestore.getInstance();
private CollectionReference notebookRef = db.collection("Notebook");
private KisteAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    FloatingActionButton buttonAddKiste = findViewById(R.id.button_add_kiste);
    buttonAddKiste.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(MainActivity.this, NewKisteActivity.class));
        }
    });

    setUpRecyclerView();
}

private void setUpRecyclerView(){
    Query query = notebookRef.orderBy("priority", Query.Direction.DESCENDING);
    FirestoreRecyclerOptions<Kiste> options = new FirestoreRecyclerOptions.Builder<Kiste>()
            .setQuery(query, Kiste.class)
            .build();
    adapter = new KisteAdapter(options);
    final RecyclerView recyclerView = findViewById(R.id.recycler_view_kiste);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);

    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT |ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            adapter.deleteKiste(viewHolder.getAdapterPosition());
            final DocumentReference docRef = adapter.getSnapshots().getSnapshot(viewHolder.getAdapterPosition()).getReference();
            final Kiste kiste = adapter.getSnapshots().getSnapshot(viewHolder.getAdapterPosition()).toObject(Kiste.class);

            Snackbar.make(recyclerView, "Item deleted", Snackbar.LENGTH_LONG)
                    .setAction("Undo", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            docRef.set(kiste);
                        }

                    }).show();
        }

        @Override
        public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
            new RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
                    .addBackgroundColor(ContextCompat.getColor(MainActivity.this, R.color.colorAccent))
                    .addActionIcon(R.drawable.ic_delete_)
                    .create()
                    .decorate();
            super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
        }
    }).attachToRecyclerView(recyclerView);

    adapter.setOnKisteClickListen(new KisteAdapter.onItemClickListener() {
        @Override
        public void onKisteClick(DocumentSnapshot documentSnapshot, int position) {
            final DocumentReference docRef = documentSnapshot.getReference();
            final CollectionReference colRef = documentSnapshot.getReference().collection("A");
            final Intent intent = new Intent(MainActivity.this,SecondaryActivity.class);
            colRef.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                    if (queryDocumentSnapshots.isEmpty()){
                        colRef.add(new Item("DFB","SGRDG",5));

                        /*intent.putExtra("Document Reference",docRef.getId());
                        intent.putExtra("Collection Reference",colRef.getId());*/
                        startActivity(intent);

                    }
                    else {
                        startActivity(intent);

                    }
                }
            });
        }
    });
}


@Override
protected void onStart() {
    super.onStart();
    adapter.startListening();
}
@Override
protected void onStop() {
    super.onStop();
    adapter.stopListening();
}

}

这是第一个 RecyclerView 得到的 Class Kiste

public class Kiste {
private String title;
private int priority;

public Kiste(){

}

public Kiste(String title, int priority){
    this.title= title;
    this.priority = priority;
}

public String getTitle() {
    return title;
}

public int getPriority() {
    return priority;
}

}

这是适配器

public class KisteAdapter extends FirestoreRecyclerAdapter<Kiste, KisteAdapter.KisteHolder> {
private onItemClickListener listener;

public KisteAdapter(@NonNull FirestoreRecyclerOptions<Kiste> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull KisteHolder holder, int position, @NonNull Kiste model) {
        holder.textViewTitle.setText(model.getTitle());
        holder.textViewPriority.setText(String.valueOf(model.getPriority()));

}

@NonNull
@Override
public KisteHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.kiste_item,parent,false);
    return new KisteHolder(v);
}

public void deleteKiste(int position){
    getSnapshots().getSnapshot(position).getReference().delete();
}

class KisteHolder extends RecyclerView.ViewHolder{
TextView textViewTitle;
TextView textViewPriority;
public KisteHolder(@NonNull View itemView) {
    super(itemView);
    textViewTitle = itemView.findViewById(R.id.text_view_title);
    textViewPriority = itemView.findViewById(R.id.text_view_priority);

    itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = getAdapterPosition();
            if (position != RecyclerView.NO_POSITION && listener!= null){
                listener.onKisteClick(getSnapshots().getSnapshot(position),position);
            }
        }
    });
}

}

public interface onItemClickListener {
    void onKisteClick(DocumentSnapshot documentSnapshot, int position);
}

public void setOnKisteClickListen (onItemClickListener listener) {this.listener = listener;}

}

因为这对我有用,所以我尝试对子集合做同样的事情(因为我仍在测试它是否可行,所以我只使用了一个我知道存在的 DocumentPath )但正如我上面所说的,应用程序不断崩溃。

这是第二个Activity

public class SecondaryActivity extends AppCompatActivity {


private FirebaseFirestore db = FirebaseFirestore.getInstance();
private CollectionReference colRef = db.collection("Notebook").document(
                        "JGBzWBwCASivfAjuF8xE").collection("A");

private ItemAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_secondary);


    FloatingActionButton buttonAddItem = findViewById(R.id.button_add_item);

    setupRecyclerView();

}

private void setupRecyclerView(){
    Query query2 = colRef.orderBy("priority", Query.Direction.DESCENDING);
    FirestoreRecyclerOptions<Item> options = new FirestoreRecyclerOptions.Builder<Item>()
            .setQuery(query2, Item.class)
            .build();

    adapter = new ItemAdapter(options);
    final RecyclerView recyclerView = findViewById(R.id.recycler_view_item);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);
}

@Override
protected void onStart() {
    super.onStart();
    adapter.startListening();
}
@Override
protected void onStop() {
    super.onStop();
    adapter.stopListening();
}

}

Class项:

public class Item {
//private Bitmap imageItem;
private String itemName;
private String itemQuantity;
private int priority;

public Item(){

}

public Item( String itemName, String itemQuantity, int priority){
    //this.imageItem = imageViewItem;
    this.itemName = itemName;
    this.itemQuantity = itemQuantity;
    this.priority = priority;
}

/*public Bitmap getImageItem() {
    return imageItem;
}*/

public String getItemName() {
    return itemName;
}

public String getItemQuantity() {
    return itemQuantity;
}

public int getPriority() {
    return priority;
}

} 和适配器:

public class ItemAdapter extends FirestoreRecyclerAdapter<Item, ItemAdapter.ItemHolder> {



public ItemAdapter(@NonNull FirestoreRecyclerOptions<Item> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull ItemHolder holder, int position, @NonNull Item model) {
    //holder.imageViewItem.setImageBitmap(model.getImageItem());
    holder.textViewTitle.setText(model.getItemName());
    holder.textViewQuantity.setText(model.getItemQuantity());
    holder.textViewPriority.setText(String.valueOf(model.getPriority()));
}

@NonNull
@Override
public ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_item,parent,false);
    return new ItemHolder(v);
}

class ItemHolder extends RecyclerView.ViewHolder{
    //ImageView imageViewItem;
    TextView textViewTitle;
    TextView textViewQuantity;
    TextView textViewPriority;
    public ItemHolder(@NonNull View itemView){
        super(itemView);
        //imageViewItem.findViewById(R.id.image_view_item);
        textViewTitle.findViewById(R.id.text_view_item_name);
        textViewQuantity.findViewById(R.id.text_view_item_quantity);
        textViewPriority.findViewById(R.id.text_view_priority2);


    }
}

}

如果有人能帮我找出问题所在,我将不胜感激。

感谢您指出控制台中的错误,现在我们无需阅读您的全部代码就可以更轻松地找出问题所在 :D

您在 ItemAdapter class 的第 47 行遇到错误。我看不出具体是哪一行,但我确定错误出在您的 ViewHolder 中。

class ItemHolder extends RecyclerView.ViewHolder{
    //ImageView imageViewItem;
    TextView textViewTitle;
    TextView textViewQuantity;
    TextView textViewPriority;
    public ItemHolder(@NonNull View itemView){
        super(itemView);
        //imageViewItem.findViewById(R.id.image_view_item);

THESE LINES OF CODE -----------------------------------------------------------------
        textViewTitle.findViewById(R.id.text_view_item_name);
        textViewQuantity.findViewById(R.id.text_view_item_quantity);
        textViewPriority.findViewById(R.id.text_view_priority2);
-------------------------------------------------------------------------------------

    }
}

将它们替换为:

this.textViewTitle = (TextView) itemView.findViewById(R.id.text_view_item_name); // and so on...

你可以看看这个例子:

https://www.javatpoint.com/android-recyclerview-list-example