Как я могу получить ключ элемента, заполненного из базы данных Firebase, по которому щелкнули в представлении реселлера - PullRequest
0 голосов
/ 22 мая 2018

У меня очень серьезная проблема.Я использую RecyclerView для заполнения данных (списка пользователей) из Firebase в моем приложении.Теперь проблема заключается в том, как ссылаться на свои соответствующие идентификаторы пользователя, когда пользователь щелкает любой из них, чтобы его можно было использовать для установки заголовка панели действий действия, которая будет открыта.Я пытался использовать метод getRef (), но это не может быть решено.Ниже приведен мой код.

Мой список студентов

package com.dreamlazerstudios.gtuconline;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
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 com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;

import static android.content.ContentValues.TAG;

public class StudentsList extends AppCompatActivity {

DatabaseReference databaseReference;
ProgressDialog progressDialog;
List<Students> listData;
RecyclerView recyclerView;
StudentsList.MyAdapter adapter;

private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
private FirebaseDatabase mFirebaseDatabase;
private String userID;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_students_list);
    setTitle("List of Students");
    recyclerView = findViewById(R.id.students_list);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setHasFixedSize(true);

    listData = new ArrayList<>();
    adapter = new StudentsList.MyAdapter(listData);
    adapter.setHasStableIds(true);

    GetDataFirebase();

    progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading Data...");
    progressDialog.show();

    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    myRef = mFirebaseDatabase.getReference();
    final FirebaseUser user = mAuth.getCurrentUser();
    userID = user.getUid();

    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                // User is signed in

                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
            } else {
                // User is signed out
                Log.d(TAG, "onAuthStateChanged:signed_out");
            }
            // ...
        }
    };

}

void GetDataFirebase() {

    databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child("Students");

    databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            Students students = dataSnapshot.getValue(Students.class);

            listData.add(students);

            recyclerView.setAdapter(adapter);

            progressDialog.dismiss();
        }

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

        }
    });


}

@Override
public void onStart() {
    super.onStart();

    mAuth.addAuthStateListener(mAuthListener);

}

public class MyAdapter extends RecyclerView.Adapter<StudentsList.MyAdapter.ViewHolder> {

    List<Students> list;

    public MyAdapter(List<Students> List) {
        this.list = List;
    }

    @Override
    public void onBindViewHolder(final StudentsList.MyAdapter.ViewHolder holder, final int position) {

        Students students = list.get(position);

        String list_user_id = getRef(position).getKey();

        holder.news_topic.setText(students.getName());
        holder.news_body.setText(students.getProgramme());

        if (students.getOnline() == true) {
            holder.online.setVisibility(View.VISIBLE);
        } else {
            holder.online.setVisibility(View.INVISIBLE);
        }

        Picasso.with(holder.news_image.getContext()).load(students.getThumb_image()).placeholder(R.drawable.student_icon_17870).into(holder.news_image);

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent chat_intent = new Intent(StudentsList.this, ChatActivity.class);
                chat_intent.putExtra("user_id", list_user_id );
                startActivity(chat_intent);
            }
        });

    }

    @NonNull
    @Override
    public StudentsList.MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.users_list_layout, parent, false);

        return new StudentsList.MyAdapter.ViewHolder(view);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView news_topic, news_body;
        CircleImageView news_image;
        ImageView online;

        public ViewHolder(View itemView) {
            super(itemView);

            news_topic = itemView.findViewById(R.id.user_single_name);
            news_body = itemView.findViewById(R.id.user_single_status);
            news_image = itemView.findViewById(R.id.user_single_image);
            online = itemView.findViewById(R.id.online_status_icon);
        }

    }

    @Override
    public int getItemCount() {
        return list.size();
    }
}

@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

}

Класс моей модели

package com.dreamlazerstudios.gtuconline;

/**
 * Created by Gabriel Hagan on 16/05/2018 at 23:10.
*/
public class Students {

String name;
String programme;
String thumb_image;
Boolean online;

public Boolean getOnline() {
    return online;
}

public void setOnline(Boolean online) {
    this.online = online;
}

public Students() {
}

public Students(String name, String programme, String thumb_image, Boolean online) {
    this.name = name;
    this.programme = programme;
    this.thumb_image = thumb_image;
    this.online = online;
}

public String getName() {
    return name;
}

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

public String getProgramme() {
    return programme;
}

public void setProgramme(String programme) {
    this.programme = programme;
}

public String getThumb_image() {
    return thumb_image;
}

public void setThumb_image(String thumb_image) {
    this.thumb_image = thumb_image;
}

}

My ChatActivity

package com.dreamlazerstudios.gtuconline;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
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 com.google.firebase.database.ValueEventListener;

public class ChatActivity extends AppCompatActivity {

private DatabaseReference rootRef;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private String userID;
private String mChatUser;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    rootRef = FirebaseDatabase.getInstance().getReference();
    mAuth = FirebaseAuth.getInstance();
    final FirebaseUser user = mAuth.getCurrentUser();
    userID = user.getUid();

    mChatUser = getIntent().getStringExtra("user_id");

    rootRef.child("Users").child("Students").child(mChatUser).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String chat_user_name = dataSnapshot.child("name").getValue().toString();
            setTitle(chat_user_name);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    rootRef.child("Chat").child(userID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
}

Мой снимок базы данных

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы можете получить ключ из DataSnapshot, который вы получаете в onChildAdded.Вместо того, чтобы иметь список студентов в вашем адаптере, вы можете сохранить список DataSnapshots.Тогда вы могли бы сделать что-то вроде этого:

В списке студентов измените:

List<Students> listData;

На:

List<DataSnapshot> listData;

Также измените onChildAdded:

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

        listData.add(dataSnapshot);
        //Should probably move these since they don't need to get called for every item.
        recyclerView.setAdapter(adapter);  
        progressDialog.dismiss();
    }

Тогда в вашем адаптере:

public class MyAdapter extends RecyclerView.Adapter<StudentsList.MyAdapter.ViewHolder> {

    List<DataSnapshot> list;

    public MyAdapter(List<DataSnapshot> List) {
        this.list = List;
    }
    @Override
    public void onBindViewHolder(final StudentsList.MyAdapter.ViewHolder holder, final int position) {

        DataSnapshot studentSnapshot = list.get(position);

        String list_user_id = studentSnapshot.getKey();

        Students students = studentSnapshot.getValue(Students.class)

        //The rest unchanged
0 голосов
/ 22 мая 2018

Внутри onBindViewHolder метода вы можете получить ключ пользователя, которого вы ищете, используя следующую строку кода:

String list_user_id = getItem(position);

getRef () используется для полученияссылка на исходное местоположение для снимка.Таким образом, вы можете использовать этот метод только для объекта снимка.Возвращает DatabaseReference и не принимает аргументов.Ниже приведен пример:

DatabaseReference ref = dataSnapshot.child("users").getRef();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...