[英]Struggling to make OnClickListener work for Firebase Recycler UI with customized ViewHolder
I'm struggling to make OnClickListener
work for each item and take de data inside each row. 我正在努力让
OnClickListener
为每个项目工作并在每行中获取de数据。
What I need is to take the name of each row that I click, however, o only can get the position. 我需要的是取出我点击的每一行的名称,但是,o只能获得该位置。 Can Anybody help me with it?
任何人都可以帮助我吗?
Here is the screenshot to show the name that I need to take. 这是截图,显示我需要采取的名称。
I need to take the NAME
there, however, I can only get the position of the row. 我需要在那里拿
NAME
,但是,我只能获得该行的位置。 How can I take the name of each row?? 我怎么能取每一行的名字?
HERE IS MY CODE 这是我的代码
UserViewHolder.class 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 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);
}
}
You can move the setting of the click listener to onBindViewHolder
: 您可以将单击侦听器的设置移动到
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());
}
});
}
I usually just give my ViewHolder
the model as well so it can populate itself—it's nice and contained that way. 我通常只是给我的
ViewHolder
模型,所以它可以填充自己 - 它很好并且包含这种方式。 So in your bind
method, also save the model to a mutable field and use that in the click listener. 因此,在
bind
方法中,还要将模型保存到可变字段并在单击侦听器中使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.