【问题标题】:firebase data recyclerview sometimes show nothingfirebase data recyclerview 有时什么也不显示
【发布时间】:2021-04-17 13:49:30
【问题描述】:

我尝试使用 recyclerview 显示 Firebase 数据。

检索数据很好,我可以在logcat中查看。

recyclerview 有时会显示数据,但通常什么都不显示。

recycleview显示数据时,很好地反映了firebase数据。

谁能告诉我什么问题?我的 xml 代码有错误吗?

Java 代码

artistData.child(starList[i]).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot starDataSnap) {
        int fanNums = (int) starDataSnap.child("fanNums").getValue(Integer.class);
        int placeNums = (int) starDataSnap.child("placeNums").getValue(Integer.class);

        Log.d("####", finalStarName + fanNums + placeNums);
        drawerStarImage = getResources().getIdentifier(finalStarImgName, "drawable", getActivity().getPackageName());
        ItemStarData itemStarData = new ItemStarData();
        itemStarData.setStarImage(drawerStarImage);
        itemStarData.setStarName(finalStarName);
        itemStarData.setFanNums(fanNums);
        itemStarData.setPlaceNums(placeNums);

        drawerStarList.add(itemStarData);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
    }

});

适配器类代码

public class AdapterStarlist extends RecyclerView.Adapter<AdapterStarlist.ViewHolder>{
    ArrayList<ItemStarData> array;
    Context context;


public AdapterStarlist(ArrayList<ItemStarData> array, Context context) {
    this.array = array;
    this.context =context;
}

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

@Override
public void onBindViewHolder(@NonNull AdapterStarlist.ViewHolder holder, int position) {
    Log.d("####", array.get(position).getStarName());
    holder.Imgstarlist.setImageResource(array.get(position).getStarImage());
    holder.followStarName.setText(String.valueOf(array.get(position).getStarName()));
    holder.starlistfanNum.setText(String.valueOf(array.get(position).getFanNums()));
    holder.starlistPlaceNum.setText(String.valueOf(array.get(position).getPlaceNums()));

}

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

public class ViewHolder extends RecyclerView.ViewHolder {
    ImageView Imgstarlist;
    TextView followStarName;
    TextView starlistfanNum;
    TextView starlistPlaceNum;


    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        Imgstarlist =itemView.findViewById(R.id.Imgstarlist);
        followStarName =itemView.findViewById(R.id.followStarName);
        starlistfanNum =itemView.findViewById(R.id.starlistfanNum);
        starlistPlaceNum =itemView.findViewById(R.id.starlistPlaceNum);

        Imgstarlist.setBackground(new ShapeDrawable(new OvalShape()));
        Imgstarlist.setClipToOutline(true);
    }
}

}

部分xml代码

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="480dp"
        android:layout_marginTop="24dp"
        android:fillViewport="true"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/DrawerStarlist"
        >

        <RelativeLayout
            android:id="@+id/rlDrawerStarlist"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/DrawerStarlist">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rvDrawerStarlist"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                />


        </RelativeLayout>

    </ScrollView>

【问题讨论】:

    标签: android firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

    看起来您正在将数据添加到drawerStarList 列表,但没有告诉适配器您已经这样做了。在您告诉适配器更改(通过调用 notifyDataSetChanged())之前,它不会重新绘制列表的 UI。

    所以通常这看起来像:

    artistData.child(starList[i]).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot starDataSnap) {
            ...
    
            drawerStarList.add(itemStarData);
    
            adapter.notifyDataSetChanged(); // tell the adapter to repaint its views
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            throw error.toException(); // never ignore errors
        }
    });
    

    adapter 是对用于管理 drawerStarList 的适配器的引用。

    【讨论】:

    • 哦,不。我之前在 addValueEventListener 之外添加了这个“adapter.notifyDataSetChanged();”。现在效果很好!!!非常感谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2016-06-28
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多