firebase将数据检索到自定义Listview和自定义适配器中

时间:2018-01-28 18:42:24

标签: java android listview arraylist

我创建了自定义列表视图和自定义适配器。我想从firebase加载数据,但我不知道如何。我经历了很多帖子,但它对我没有帮助。我需要有人来指导我。

我需要的是告诉我如何检索数据;

This is the structure

数据模型:

public class MessagesListDataModel {
 private String uid;
 private String msg;

 public MessagesListDataModel(){

 }

public MessagesListDataModel(String UID, String Message){
    this.uid = UID;
    this.uid = Message;

}//instance of datamodel

public String getUID(){
    return uid;
}

public String getMessage(){
    return msg;
}

}

自定义适配器:

public class MessagesListAdapter extends ArrayAdapter<MessagesListDataModel> {

private ArrayList<MessagesListDataModel> dataModels;

public MessagesListAdapter(Context context, int resource, ArrayList<MessagesListDataModel> dataModels){
    super(context, resource, dataModels);
    this.dataModels = dataModels;

}


public View getView(int position, View convertView, ViewGroup parent){

    View v = convertView;

    if (v == null) {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.chat_messages_layout, null);
    }

    MessagesListDataModel MessagesListDataModel = dataModels.get(position);

    if (MessagesListDataModel != null) {

        // These TextViews are created in the XML files defined.

        TextView uid = (TextView) v.findViewById(R.id.textViewMessage);
        TextView message = (TextView) v.findViewById(R.id.textViewUserID);


        // check to see if each individual textview is null.
        // if not, assign some text!
        if (uid != null){
            uid.setText(MessagesListDataModel.getUID());
        }
        if (message != null){
            message.setText(MessagesListDataModel.getMessage());
        }

    }

    // the view must be returned to our activity
    return v;

}
}

在Main:

chatroomsref = FirebaseDatabase.getInstance().getReference("Chatrooms");

    ///////
    ListViewMessages = (ListView) findViewById(R.id.chatRoomMessagesListview);



ArrayAdapter<MessagesListAdapter> arrayAdapter = new ArrayAdapter<MessagesListAdapter>(this, R.layout.chat_messages_layout,messages);
    ListViewMessages.setAdapter(arrayAdapter);

    chatroomsref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            fetchData();
        }

        @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) {

        }
    });

fetchData:

我需要知道如何获取数据,以便迭代所有具有唯一ID的聊天室,并从数据库获取数据并将其分配给这些文本视图并显示数据,以便我可以运行此功能数据库参考。但我不知道怎么办?

所以我在主要做的是:

room_name = getIntent().getExtras().get("room_name").toString();

我拥有的所有聊天室的列表视图都有一个点击甚至是监听器,当点击房间时,它将房间名称作为字符串传递到所有这应该发生的活动中。所以我将该变量传递给检索,以便在输入特定房间时更新引用:

chatroomsref = FirebaseDatabase.getInstance().getReference("Chatrooms").child(room_name);

但现在我收到了这个错误:

  

处理:com.brunelcs.group13.anyquestions,PID:14662                     java.lang.IllegalStateException:ArrayAdapter要求资源ID为TextView                         在android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:437)

XML:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/textViewUserID"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="12dp"
    android:layout_marginTop="14dp"
    android:layout_weight="1"
    android:text="UserID"
    android:textAlignment="viewStart"
    android:textColor="@color/colorPrimary"
    android:textSize="12sp" />

<TextView
    android:id="@+id/textViewDateTime"
    android:layout_width="150dp"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/textViewUserID"
    android:layout_marginStart="11dp"
    android:layout_toEndOf="@+id/textViewUserID"
    android:text="DateTime"
    android:textAlignment="center"
    android:textColor="@color/colorPrimary"
    android:textSize="12sp" />

<TextView
    android:id="@+id/textViewMessage"
    android:layout_width="500dp"
    android:layout_height="50dp"
    android:layout_alignStart="@+id/textViewUserID"
    android:layout_below="@+id/textViewUserID"
    android:text="Message"
    android:textAlignment="viewStart"
    android:textSize="15dp" />

<Button
    android:id="@+id/button5"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:layout_alignStart="@+id/textViewMessage"
    android:layout_below="@+id/textViewMessage"
    android:text="Replies" />

<Button
    android:id="@+id/button6"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:layout_alignBottom="@+id/button5"
    android:layout_alignStart="@+id/textViewDateTime"
    android:text="Like" />

<TextView
    android:id="@+id/textView11"
    android:layout_width="30dp"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/button6"
    android:layout_marginBottom="13dp"
    android:layout_toEndOf="@+id/button6"
    android:text="24"
    android:textAlignment="center" />

我也不应该使用:

//for (DataSnapshot child : dataSnapshot.getChildren()) {

}

并为那个房间的每个孩子检索数据?但我不知道怎么做。

2 个答案:

答案 0 :(得分:0)

public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            //fetchData();
           MessagesListDataModel messagesListDataModel = 
           dataSnapshot.getValue(MessagesListDataModel.class);    
           ListvViewMessages.add(messagesListDataModel);
           arrayAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
             // do similar to add 
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
                   //remove the entry from array list if required
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

重要的是数据结构变量应该与模型类中的变量名称匹配。 代替 private String UID; 私有字符串消息;

使用 private String msg; 私有字符串名称;

答案 1 :(得分:0)

首先,我建议您使用Firebase UI填充列表

无论如何,你使用的构造是错误的。

new ArrayAdapter<MessagesListAdapter>(this, R.layout.chat_messages_layout,messages);

阅读文档......它说第二个参数是一个只有TextView的资源

  

resource int:包含在实例化视图时使用的TextView的布局文件的资源ID。

您的XML文件是RelativeLayout,而不是TextView,因此错误。

因此,您定义了一个自定义适配器,但您从未做过这样做。

new MessagesListAdapter(this, messages);

为了正确使用它,你需要实现这个不使用资源ID的构造函数,因为已经在适配器的getView中使用它

public MessagesListAdapter(Context context, ArrayList<MessagesListDataModel> dataModels){
    super(context, 0, dataModels);
    // This line isn't necessary, either. The third parameter of super() already sets an internal arraylist
    this.dataModels = dataModels;  
}

不清楚fetchData()实际上在做什么,但你需要在那里迭代DataSnapshot子项。