我创建了自定义列表视图和自定义适配器。我想从firebase加载数据,但我不知道如何。我经历了很多帖子,但它对我没有帮助。我需要有人来指导我。
我需要的是告诉我如何检索数据;
数据模型:
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()) {
}
并为那个房间的每个孩子检索数据?但我不知道怎么做。
答案 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子项。