Студия Android: CutomListView выдает странный вывод, вместо этого он должен предоставлять данные из базыЛюбые решения? - PullRequest
0 голосов
/ 28 апреля 2019

Я довольно новичок в разработке для Android, хотя я хотел создать приложение для чата. Вход и регистрация с использованием Firebase auth работают хорошо, общение в целом тоже. Но я хотел создать лучший внешний вид и искал методы о том, как сделать вырез ListView. Но ни один учебник не показал метод, использующий данные Firebase, поэтому я отчаянно попробовал его самостоятельно. К сожалению, это дает мне странный вывод на моем телефоне. Он показывает стандартный значок запуска в ImageView, который должен быть изображением профиля пользователя. В одном TextView показан какой-то странный вывод, например: com.glowchat.app.DataClass@3012dc4 -> Glowchat - название моего приложения. DataClass - это класс в моем пакете com.glowchat.app. Второй TextView не показывает никаких изменений, он показывает «[Сообщение]», как и должно, если изменение текста не сработало. Я уверен, что следующий код - полная фигня, но спасибо за просмотр и попытку помочь мне.

PS: я оставил старый стандартный адаптер, чтобы легко переключаться между ними в целях тестирования, так что не запутайтесь в этом.

TestserverActivity.java

package com.glowchat.app;

import android.content.Context;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.net.URL;
import java.util.ArrayList;

public class TestserverActivity extends AppCompatActivity {

    private Button sendbutton;
    private EditText sendmessage;
    private ListView data;

    private ArrayList<String> arrayList = new ArrayList<>();
    private ArrayList<DataClass> arrList = new ArrayList<>();
    private ArrayAdapter<String> adapter;
    private ArrayAdapter<DataClass> adap;

    private DatabaseReference database;
    private FirebaseUser user;
    private FirebaseAuth auth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_testserver);

        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
        adap = new ArrayAdapter<DataClass>(this, R.layout.datadisplay, R.id.displayname, arrList);

        auth = FirebaseAuth.getInstance();

        database = FirebaseDatabase.getInstance().getReference().child("Testserverdata");
        user = auth.getCurrentUser();

        sendbutton = (Button) findViewById(R.id.serversendbutton);
        sendmessage = (EditText) findViewById(R.id.serversendmessage);
        data = (ListView) findViewById(R.id.serverdata);

        sendbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(sendmessage.getText().toString().isEmpty()) {

                } else {
                    database.push().setValue(sendmessage.getText().toString());

                    sendmessage.setText("");
                }
            }
        });

        database.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                String string = dataSnapshot.getValue(String.class);
                String tmpname = user.getEmail();
                String tmpmessage = string;
                Uri image = user.getPhotoUrl();

                arrList.add(new DataClass(tmpname, tmpmessage, image));

                adap.notifyDataSetChanged();

                data.setAdapter(adap);
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

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

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }
}

ChatAdapter.java

package com.glowchat.app;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class ChatAdapter extends BaseAdapter {

    Context context;
    ArrayList<DataClass> arrList;

    public ChatAdapter(Context context, ArrayList<DataClass> arrList) {
        this.context = context;
        this.arrList = arrList;
    }

    @Override
    public int getCount() {
        return arrList.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        convertView = LayoutInflater.from(context).inflate(R.layout.datadisplay, parent, false);

        TextView name = (TextView) convertView.findViewById(R.id.displayname);
        TextView message = (TextView) convertView.findViewById(R.id.displaymessage);
        ImageView image = (ImageView) convertView.findViewById(R.id.profilepic);

        name.setText(arrList.get(position).getName());
        message.setText(arrList.get(position).getMessage());
        image.setImageURI(arrList.get(position).getImage());

        return convertView;
    }

}

DataClass.java

package com.glowchat.app;

import android.net.Uri;

public class DataClass {

    String name;
    String message;
    Uri image;

    public DataClass(String name, String message, Uri image) {
        this.name = name;
        this.message = message;
        this.image = image;

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Uri getImage() {
        return image;
    }

    public void setImage(Uri image) {
        this.image = image;
    }

}

Данные JSON Firebase:

{
  "Testserverdata" : {
    "-LdXa2gqdIND7Pk6094N" : "Hello",
    "-LdXbb_1Fvh0jxsC5zYx" : "u4witsit",
    "-LdXblvyFdMW9XMnbYpW" : "jgug",
    "-LdXtP9ZzjL_a4A4Yqqf" : "moin",
    "-LdYDEBP-ikhIyYWnh3r" : "zgxcc",
    "-LdYEwHcWLzUhM9Rjp4y" : "jfufuru",
    "-LdYwkwKkuxm9plle4hZ" : "hcch",
    "-LdZFhvuXuIJIMRSECNO" : "fjdvve",
    "-LdZFjM7DMr9krCGGei4" : "Nsjabwbs",
    "-LdZNpphDsXfG5JDGd1a" : "uxx"
  }
}

1 Ответ

1 голос
/ 28 апреля 2019

Когда вы получаете данные из Firebase, вы делаете это:

database.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        String string = dataSnapshot.getValue(String.class);
        String tmpname = user.getEmail();
        String tmpmessage = string;
        Uri image = user.getPhotoUrl();

        arrList.add(new DataClass(tmpname, tmpmessage, ));

        adap.notifyDataSetChanged();

        data.setAdapter(adap);
    }

В первой строке onDataChange вы получаете значение dataSnapshot в виде строки: dataSnapshot.getValue(String.class).Это означает, что любое значение или объект JSON, которые вы могли иметь в базе данных, преобразуется в строку.

Если у вас есть объект JSON, вы, скорее всего, захотите сделать dataSnapshot.getValue(DataClass.class), а затемполучить правильное свойство из результирующего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...