【问题标题】:firebase Retrieve data into custom Listview and Custom Adapterfirebase 将数据检索到自定义 Listview 和自定义适配器中
【发布时间】:2018-01-28 18:42:23
【问题描述】:

我创建了一个自定义列表视图和一个自定义适配器。我想从 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;

}
}

在主要:

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

        }
    });

获取数据:

我需要知道如何获取数据,以便它遍历所有具有唯一 ID 的聊天室,然后他们从数据库中获取该数据并将其分配给这些文本视图并显示数据,以便我可以在其中运行此功能数据库参考。但我不知道怎么做?

所以我在 main 中所做的是:

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

}

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

【问题讨论】:

  • 解决最后一个错误,查看stackoverflow.com/questions/9280965/…
  • 我已经检查了帖子,据我了解,我只能使用这种方法使用一个文本视图。我怎样才能让多个文本视图工作?

标签: java android listview arraylist


【解决方案1】:

首先,我建议您使用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 子项。

【讨论】:

  • 获取数据为空,我打算使用方法获取数据。
  • 我的适配器也接受:public MessagesListAdapter(Context context, int resource, ArrayList dataModels)。当我尝试设置资源时,它不会让我执行构造函数会出错。
  • 这个构造函数接受列表视图的 id 而不是列表视图的资源文件
  • 这对我来说真的没有意义,你能详细说明吗?
  • 看这个例子。您的构造函数需要更改。该资源不需要传递,它不是 LIstView 的 ID,即使它是。这将是一个R.layout 资源。 github.com/codepath/android_guides/wiki/…
【解决方案2】:
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) {

        }

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

使用 私人字符串味精; 私有字符串名称;

【讨论】:

  • ListvViewMessages.add?没有添加();方法
  • 对不起 ListvViewMessages.add(messagesListDataModel);
  • 我收到此错误:进程:com.brunelcs.group13.anyquestions,PID:11454 com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为类型com.brunelcs.group13.anyquestions.MessagesListDataModel
  • 在这一行:MessagesListDataModel messagesListDataModel = dataSnapshot.getValue(MessagesListDataModel.class);
  • chatroomsref = FirebaseDatabase.getInstance().getReference("Chatrooms").child("1234");也正如我所说,更改模型类中的变量名称。
猜你喜欢
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 2014-01-01
相关资源
最近更新 更多