读取Firebase数据库并在RecyclerView中显示:Android
这是我的代码: Liste.java文件:读取Firebase数据库并在RecyclerView中显示:Android,android,firebase,firebase-realtime-database,android-recyclerview,Android,Firebase,Firebase Realtime Database,Android Recyclerview,这是我的代码: Liste.java文件: public class Liste extends AppCompatActivity{ RecyclerView myRecyclerview; MyAdapter adapter; List<Dentist> listDentist; FirebaseDatabase FDB; DatabaseReference DBR; @Override protected void o
public class Liste extends AppCompatActivity{
RecyclerView myRecyclerview;
MyAdapter adapter;
List<Dentist> listDentist;
FirebaseDatabase FDB;
DatabaseReference DBR;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_liste );
myRecyclerview = (RecyclerView) findViewById ( R.id.myRecycler );
RecyclerView.LayoutManager LM = new LinearLayoutManager ( getApplicationContext ());
myRecyclerview.setLayoutManager ( LM );
myRecyclerview.setItemAnimator ( new DefaultItemAnimator () );
myRecyclerview.addItemDecoration ( new DividerItemDecoration ( getApplicationContext (),LinearLayoutManager.VERTICAL ) );
listDentist = new ArrayList<> ( );
adapter = new MyAdapter (listDentist);
FDB= FirebaseDatabase.getInstance ();
GetDataFirebase();
void GetDataFirebase(){
DBR = FDB.getReference ("dentistes");
DBR.addChildEventListener ( new ChildEventListener ( ) {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Dentist data = dataSnapshot.getValue (Dentist.class);
//Add to Arraylist
listDentist.add ( data );
//Add list into adapter
myRecyclerview.setAdapter ( adapter );
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
} );
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
List<Dentist> listArray;
public MyAdapter (List<Dentist> List){
this.listArray = List;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from ( parent.getContext ()).inflate ( R.layout.itemview,parent,false );
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Dentist data = listArray.get ( position );
holder.MyText.setText ( data.getName () );
}
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView MyText;
public MyViewHolder(View itemView) {
super ( itemView );
MyText = (TextView)itemView.findViewById ( R.id.textview_dentist );
}
}
@Override
public int getItemCount() {
return listArray.size ();
}
}
}
public class Dentist {
private String Name;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
我有两个问题:
- 牙医列表正确显示在my Recyclerview中,但logcat显示“E/Recyclerview:未连接适配器;跳过布局”:我如何更正此问题
- 如果我更改了类模型的结构:例如,我添加了地址和电话号码:我应该如何更改代码,以便在我的Recyclerview中显示每个牙医的姓名、地址和号码
adapter = new MyAdapter(listDentist);
onchildaded()
方法。必须在此方法中声明并使用适配器
Dentist
类要消除logcat中的警告,请在onCreate方法中设置适配器,并在onChildaded方法中调用adapter.notifyDataSetChanged()以更新值
public class Liste extends AppCompatActivity{
RecyclerView myRecyclerview;
MyAdapter adapter;
List<Dentist> listDentist;
FirebaseDatabase FDB;
DatabaseReference DBR;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_liste );
myRecyclerview = (RecyclerView) findViewById ( R.id.myRecycler );
RecyclerView.LayoutManager LM = new LinearLayoutManager ( getApplicationContext ());
myRecyclerview.setLayoutManager ( LM );
myRecyclerview.setItemAnimator ( new DefaultItemAnimator () );
myRecyclerview.addItemDecoration ( new DividerItemDecoration ( getApplicationContext (),LinearLayoutManager.VERTICAL ) );
listDentist = new ArrayList<> ( );
adapter = new MyAdapter (listDentist);
//Set empty adapter here
myRecyclerView.setAdapter(adapter);
FDB= FirebaseDatabase.getInstance ();
GetDataFirebase();
void GetDataFirebase(){
DBR = FDB.getReference ("dentistes");
DBR.addChildEventListener ( new ChildEventListener ( ) {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Dentist data = dataSnapshot.getValue (Dentist.class);
//Add to Arraylist
listDentist.add ( data );
//Add list into adapter
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
} );
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
List<Dentist> listArray;
public MyAdapter (List<Dentist> List){
this.listArray = List;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from ( parent.getContext ()).inflate ( R.layout.itemview,parent,false );
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Dentist data = listArray.get ( position );
holder.MyText.setText ( data.getName () );
}
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView MyText;
public MyViewHolder(View itemView) {
super ( itemView );
MyText = (TextView)itemView.findViewById ( R.id.textview_dentist );
}
}
@Override
public int getItemCount() {
return listArray.size ();
}
}
}
公共类列表扩展了AppCompative活动{
回收视图myRecyclerview;
MyAdapter适配器;
名单;
FirebaseDatabaseFDB;
数据库参考数据库;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_liste);
myRecyclerview=(RecyclerView)findViewById(R.id.myRecycler);
RecyclerView.LayoutManager LM=新的LinearLayoutManager(getApplicationContext());
myRecyclerview.setLayoutManager(LM);
myRecyclerview.setItemAnimator(新的DefaultItemAnimator());
myRecyclerview.addItemDecoration(新的DividerItemDecoration(getApplicationContext(),LinearLayoutManager.VERTICAL));
listdister=newarraylist();
适配器=新的MyAdapter(列表);
//在此设置空适配器
myRecyclerView.setAdapter(适配器);
FDB=FirebaseDatabase.getInstance();
GetDataFirebase();
void GetDataFirebase(){
DBR=FDB.getReference(“牙医”);
DBR.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
牙医数据=dataSnapshot.getValue(牙医类);
//添加到Arraylist
listdistent.add(数据);
//将列表添加到适配器中
adapter.notifyDataSetChanged();
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
} );
}
公共类MyAdapter扩展了RecyclerView.Adapter{
列表数组;
公共MyAdapter(列表){
this.listary=List;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.itemview,parent,false);
返回新的MyViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
数据=listary.get(位置);
holder.MyText.setText(data.getName());
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
文本查看我的文本;
公共MyViewHolder(查看项目视图){
超级(项目视图);
MyText=(TextView)itemView.findViewById(R.id.TextView\u);
}
}
@凌驾
public int getItemCount(){
返回listArray.size();
}
}
}
对于Alex Mamo提到的第二个问题,您需要在牙医类中添加所需的字段以及相应的getter和setter。1-消息“E/RecyclerView:未连接适配器;跳过布局”总是显示在日志cat.2中-我知道我应该将这些私有字段添加到Destinter类中,但我在如何更改Liste.java文件中的代码方面遇到了障碍。请确保您是从onchildaded()中的“main”线程调用该语句方法。这是您唯一要执行此操作的地方。也在该方法中声明
myRecyclerview
。它现在起作用了吗?牙医列表正确显示在我的Recyclerview中,但日志再次显示此错误:但这不是问题。我需要我的问题的答案第二个问题。正如前面回答的,首先你需要更改模型类,然后通过每个牙医的孩子循环获取数据。现在可以了吗?我的答案有什么问题?请给我一个解释。
adapter = new MyAdapter(listDentist);
public class Liste extends AppCompatActivity{
RecyclerView myRecyclerview;
MyAdapter adapter;
List<Dentist> listDentist;
FirebaseDatabase FDB;
DatabaseReference DBR;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_liste );
myRecyclerview = (RecyclerView) findViewById ( R.id.myRecycler );
RecyclerView.LayoutManager LM = new LinearLayoutManager ( getApplicationContext ());
myRecyclerview.setLayoutManager ( LM );
myRecyclerview.setItemAnimator ( new DefaultItemAnimator () );
myRecyclerview.addItemDecoration ( new DividerItemDecoration ( getApplicationContext (),LinearLayoutManager.VERTICAL ) );
listDentist = new ArrayList<> ( );
adapter = new MyAdapter (listDentist);
//Set empty adapter here
myRecyclerView.setAdapter(adapter);
FDB= FirebaseDatabase.getInstance ();
GetDataFirebase();
void GetDataFirebase(){
DBR = FDB.getReference ("dentistes");
DBR.addChildEventListener ( new ChildEventListener ( ) {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Dentist data = dataSnapshot.getValue (Dentist.class);
//Add to Arraylist
listDentist.add ( data );
//Add list into adapter
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
} );
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
List<Dentist> listArray;
public MyAdapter (List<Dentist> List){
this.listArray = List;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from ( parent.getContext ()).inflate ( R.layout.itemview,parent,false );
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Dentist data = listArray.get ( position );
holder.MyText.setText ( data.getName () );
}
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView MyText;
public MyViewHolder(View itemView) {
super ( itemView );
MyText = (TextView)itemView.findViewById ( R.id.textview_dentist );
}
}
@Override
public int getItemCount() {
return listArray.size ();
}
}
}