简体   繁体   English

即使设置了 getitemcount 和布局管理器,RecyclerView 也不显示任何项目

[英]RecyclerView not displaying any items even after getitemcount is set and layoutmanager is set

I tried most of the solution which were mentioned here with similar problem but none seems to work for me...for now what i have observed is that the code is able to get the data from firebase and it is able to set the data but the getitemcount method is not updating it is still display zero even after i have set it to the itemlist size any help as to what i am doing wrong would be helpful我尝试了这里提到的大多数具有类似问题的解决方案,但似乎没有一个对我有用......现在我观察到的是代码能够从 firebase 获取数据并且能够设置数据但是getitemcount 方法没有更新它仍然显示为零,即使我将它设置为项目列表大小任何关于我做错了什么的帮助都会有所帮助

Activity class

package com.example.sololeveling;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.widget.Toast;

import com.example.sololeveling.DAO.CasinoCouponsDao;
import com.example.sololeveling.DAO.CasinoHistoryDao;
import com.example.sololeveling.DAO.CouponDao;
import com.example.sololeveling.DAO.UserDAO;
import com.example.sololeveling.Entity.CasinoHistory;
import com.example.sololeveling.adapter.CasinoHistoryAdapter;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class HistoryActivity extends AppCompatActivity {

    CasinoHistoryDao casinoHistoryDao;
    RecyclerView casinoHistoryView;
    CasinoHistoryAdapter casinoHistoryAdapter;

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

        initializeLevelObjects();
        loadRollHistory();


        casinoHistoryView.setAdapter(casinoHistoryAdapter);
        casinoHistoryView.setLayoutManager(new LinearLayoutManager(this));
    }

    private void loadRollHistory()
    {
        casinoHistoryDao.get().addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                ArrayList<CasinoHistory> casinoHistoryArrayList = new ArrayList<>();
                for(DataSnapshot dataSnapshot : snapshot.getChildren())
                {
                    CasinoHistory casinoHistory = dataSnapshot.getValue(CasinoHistory.class);
                    casinoHistory.setKey(dataSnapshot.getKey());
                    casinoHistoryArrayList.add(casinoHistory);
                }
                casinoHistoryAdapter.setCasinoHistoryArrayList(casinoHistoryArrayList);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(HistoryActivity.this, "Fail to get data.", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initializeLevelObjects()
    {
        casinoHistoryDao = new CasinoHistoryDao();
        casinoHistoryView = findViewById(R.id.historyrollview);
        casinoHistoryAdapter = new CasinoHistoryAdapter(this);
    }
}

Adapter class

package com.example.sololeveling.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.sololeveling.Entity.CasinoHistory;
import com.example.sololeveling.R;
import com.example.sololeveling.ViewHolder.CasinoHistoryViewHolder;

import java.util.ArrayList;

public class CasinoHistoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
{
    private Context context;
    ArrayList<CasinoHistory> casinoHistoryArrayList = new ArrayList<>();

    public CasinoHistoryAdapter(Context context) {
        this.context = context;
    }

    public void setCasinoHistoryArrayList(ArrayList<CasinoHistory> casinoHistories)
    {
        this.casinoHistoryArrayList = casinoHistories;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.casino_history_list, parent, false);
        return new CasinoHistoryViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        CasinoHistoryViewHolder casinoHistoryViewHolder = (CasinoHistoryViewHolder) holder;
        CasinoHistory casinoHistory = casinoHistoryArrayList.get(position);
        casinoHistoryViewHolder.historyView.setText("you got " + casinoHistory.getCoupon() + " at " + casinoHistory.getDate());
    }

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

ViewHolder class

package com.example.sololeveling.ViewHolder;

import android.util.Log;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.sololeveling.R;

public class CasinoHistoryViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
    public TextView historyView;

    public CasinoHistoryViewHolder(@NonNull View itemView) {
        super(itemView);
        historyView = itemView.findViewById(R.id.historyview);
        Log.d("CasinoHistoryViewHolder","inside");
    }

    @Override
    public void onClick(View view) {

    }
}

main activity xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".HistoryActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/historyrollview"
        android:layout_width="412dp"
        android:layout_height="729dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

item list xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="75dp"
    android:clickable="true"
    android:focusable="true"
    app:cardUseCompatPadding="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp">

        <TextView
            android:id="@+id/historyview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="daily task"
            android:textAppearance="@style/TextAppearance.AppCompat.Large" />
    </LinearLayout>

</com.google.android.material.card.MaterialCardView>

Call notifyDataSetChanged() method after changing your data.更改数据后调用 notifyDataSetChanged() 方法。 This android function notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.这个 android function 通知附加的观察者底层数据已经改变,任何反映数据集的视图都应该刷新自己。

public void setCasinoHistoryArrayList(ArrayList<CasinoHistory> casinoHistories)
{
    this.casinoHistoryArrayList = casinoHistories;
    notifyDataSetChanged();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM