问题描述
免责声明:在浏览了整个 StackOverflow 之后,我还没有找到解决方案。
我之前在另一个 Activity 中成功使用了 RecyclerView,因此我将该代码移植到 Fragment 中。我不确定为什么这些项目没有显示在 RecyclerView 中。经过调试,似乎 Fragment_Upcoming_Activities 类没有调用 ActivitiesAdapter 方法,例如 onBindViewHolder() 和 onCreateViewHolder()。
Fragment_Upcoming_Activities.java:
private FirebaseAuth fAuth;
private FirebaseFirestore fStore;
private FirebaseUser mFirebaseUser;
private RecyclerView mFirestoreList;
private String currentUid;
private CollectionReference catRef;
private List<String> list_category = new ArrayList();
private ArrayAdapter<String> adapter_category;
private Spinner spCategories;
private ActivitiesAdapter adapter;
private View view;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,@NonNull ViewGroup container,@NonNull Bundle savedInstanceState) {
fAuth = FirebaseAuth.getInstance();
mFirebaseUser = fAuth.getCurrentUser();
fStore = FirebaseFirestore.getInstance();
currentUid = mFirebaseUser.getUid();
return inflater.inflate(R.layout.fragment_upcoming_activity,container,false);
}
@Override
public void onViewCreated(View view,@Nullable Bundle savedInstanceState) {
super.onViewCreated(view,savedInstanceState);
spCategories = view.findViewById(R.id.category_spinner);
mFirestoreList = view.findViewById(R.id.upcoming_act_recycleView);
//setUpCategoriesspinner();
setupRecyclerView();
}
public void setUpCategoriesspinner(){
//Department spinner population
catRef = fStore.collection("parent_categories");
list_category = new ArrayList<>();
adapter_category = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item,list_category);
adapter_category.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spCategories.setAdapter(adapter_category);
spCategories.setonItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent,View view,int position,long id) {
String selected = (String) parent.getSelectedItem();
displayUserData(selected);
}
@Override
public void onnothingSelected(AdapterView<?> parent) {
}
});
catRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
String categoryName = document.getString("category_name");
list_category.add(categoryName);
}
adapter_category.notifyDataSetChanged();
}
}
});
}
public void displayUserData(String selected){
System.out.println("Selected category: " + selected);
Query query;
if (selected.equals("All Categories")) {
System.out.println("ALL");
query = fStore.collection("activities").whereEqualTo("act_purpose","All");
} else {
System.out.println("OTHER");
String sub = selected.substring(selected.length() - 1);
System.out.println(sub);
int catNo = Integer.parseInt(sub);
query = fStore.collection("activities").whereEqualTo("act_purpose","All").whereGreaterThan("act_category_number",sub).whereLessthan("act_category_number",sub).orderBy("act_category_number",Query.Direction.DESCENDING).orderBy("start_date",Query.Direction.DESCENDING);
}
//RecyclerOptions
FirestoreRecyclerOptions<ActivitiesModel> options = new FirestoreRecyclerOptions.Builder<ActivitiesModel>()
.setQuery(query,ActivitiesModel.class)
.build();
//View Holder
adapter.updateOptions(options);
}
private void setupRecyclerView(){
Query query = fStore.collection("activities");
//RecyclerOptions
FirestoreRecyclerOptions<ActivitiesModel> options = new FirestoreRecyclerOptions.Builder<ActivitiesModel>()
.setQuery(query,ActivitiesModel.class)
.build();
//View Holder
adapter = new ActivitiesAdapter(options);
mFirestoreList.setLayoutManager(new linearlayoutmanager(getContext()));
mFirestoreList.setAdapter(adapter);
adapter.setonItemClickListener(new ActivitiesAdapter.OnItemClickListener() {
@Override
public void onItemClick(DocumentSnapshot documentSnapshot,int position) {
}
});
}
ActivityAdapter.java:
private ActivitiesAdapter.OnItemClickListener listener;
public ActivitiesAdapter(@NonNull FirestoreRecyclerOptions<ActivitiesModel> options) {
super(options);
}
@Override
protected void onBindViewHolder(@NonNull ActivitiesAdapter.ActivitiesHolder holder,@NonNull ActivitiesModel model) {
String temp = model.getStart_date().toString().trim();
String[] temparray = temp.split(" ");
String startMonth = temparray[1];
String startDate = temparray[2];
String startYear = temparray[5];
String act_title = model.getAct_title();
String act_catName = model.getAct_category_name();
String pdHoursAndPoints = model.getPoints() + " Points · " + model.getHours() + " Hours";
holder.actTitle.setText(act_title);
holder.startDate.setText(startDate + "\n" + startMonth + "\n" + startYear);
holder.actCategory.setText(act_catName);
holder.actPointsAndHours.setText(pdHoursAndPoints);
}
@NonNull
@Override
public ActivitiesAdapter.ActivitiesHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_actlog,parent,false);
return new ActivitiesAdapter.ActivitiesHolder(v);
}
class ActivitiesHolder extends RecyclerView.ViewHolder {
private TextView startDate,actTitle,actCategory,actPointsAndHours;
public ActivitiesHolder(View itemView) {
super(itemView);
startDate = itemView.findViewById(R.id.textview_startdate);
actTitle = itemView.findViewById(R.id.textview_act_title);
actCategory = itemView.findViewById(R.id.textview_act_category);
actPointsAndHours = itemView.findViewById(R.id.textview_pointsandhours_act);
itemView.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION && listener != null){
listener.onItemClick(getSnapshots().getSnapshot(position),position);
//insert intent for edit here
}
}
});
}
}
public interface OnItemClickListener{
void onItemClick(DocumentSnapshot documentSnapshot,int position);
}
public void setonItemClickListener(ActivitiesAdapter.OnItemClickListener listener){
this.listener = listener;
}
解决方法
我太笨了,我忘了添加 onStart() 和 onStop() 方法。希望这可以帮助任何有同样问题的人。
@Override
public void onStart() {
super.onStart();
if(adapter != null){
adapter.startListening();
}
}
@Override
public void onStop() {
super.onStop();
if(adapter != null){
adapter.stopListening();
}
}