Java – Work to make OnClickListener work for Firebase Recycler UI with custom ViewHolders

Work to make OnClickListener work for Firebase Recycler UI with custom ViewHolders… here is a solution to the problem.

Work to make OnClickListener work for Firebase Recycler UI with custom ViewHolders

I’m working on getting OnClickListener to work for each project and fetch data in every row.

What I need is to get the name of each row I click, however, o can only get the location. Can someone help me?

Here is a screenshot showing the name I need to use.

enter image description here

I

need to put NAME there, however, I can only get the position of the line. How can I take the name of each line?

Here is my code

UserViewHolder.class

package br.sosqueen.com.sosqueen;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import static java.security.AccessController.getContext;

/**
 * Created by calvin on 15/04/2018.
 */

public class UsersViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

View mView;
    Context mContext;

public UsersViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        mContext = itemView.getContext();
        itemView.setOnClickListener(this);
    }

public void bind(User user) {
        TextView user_name = (TextView) mView.findViewById(R.id.name_text);
        TextView user_status = (TextView) mView.findViewById(R.id.status_text);

user_name.setText(user.getUsername());
        user_status.setText(user.getStatus());
    }

@Override
    public void onClick(View view) {
        Log.d("viewholder", " " + getLayoutPosition());
    }
}

SearchFragment.java

package br.sosqueen.com.sosqueen;

import android.os.Bundle;
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.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;

public class SearchFragment extends android.support.v4.app.Fragment {

private EditText mSearchField;
    private ImageButton mSearchBtn;
    private RecyclerView mResultList;
    private DatabaseReference mUserDatabase;

public static SearchFragment newInstance() { return new SearchFragment();  }

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
         Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_search, container, false);
        mSearchField = (EditText) view.findViewById(R.id.search_field);
        mSearchBtn = (ImageButton) view.findViewById(R.id.search_btn);

mResultList = (RecyclerView) view.findViewById(R.id.result_list);
        mResultList.setHasFixedSize(true);
        mResultList.setLayoutManager(new LinearLayoutManager(mResultList.getContext()));

mSearchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String searchText = mSearchField.getText().toString();
                firebaseUserSearch(searchText);
            }
        });

mUserDatabase = FirebaseDatabase.getInstance().getReference("usuarios");
        return view;
    }

public void firebaseUserSearch(String searchText) {
        Toast.makeText(getContext(), "Started Search", Toast.LENGTH_LONG).show();

Query firebaseSearchQuery = mUserDatabase.orderByChild("username").startAt(searchText).endAt(searchText + "\uf8ff");
        FirebaseRecyclerOptions<User> options =
                new FirebaseRecyclerOptions.Builder<User>()
                        .setQuery(firebaseSearchQuery, User.class)
                        .build();

FirebaseRecyclerAdapter<User, UsersViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<User, UsersViewHolder>(options) {
            @Override
            public UsersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                Log.d("debugaoBuild","Antes de inflar");
                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_layout, parent, false);
                Log.d("debugaoBuild","inflou");
                return new UsersViewHolder(v);
            }

@Override
            protected void onBindViewHolder(UsersViewHolder holder, int position, User model) {
                holder.bind(model);
            }
        };
        firebaseRecyclerAdapter.startListening();
        mResultList.setAdapter(firebaseRecyclerAdapter);
    }
}

Solution

You can move the settings of the click listener to onBindViewHolder:

    protected void onBindViewHolder(UsersViewHolder holder, int position, User model) {
                    holder.bind(model);
                    holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                         public void onClick(View v) {
                             Log.d("viewholder", " " + holder.getAdapterPosition());
                             Log.d("viewholder", " " + model.getUsername());

}
                    });
     }

Related Problems and Solutions