[英]RecyclerView onclick doesnt work
我試圖使我單擊並在RecyclerView上添加項目,它將打開包含所單擊項目詳細信息的新活動。
我的adapter.java代碼是:
public class AdapterUsersData extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private LayoutInflater inflater;
List<UsersData> data= Collections.emptyList();
UsersData current;
int currentPos=0;
// create constructor to innitilize context and data sent from MainActivity
public AdapterUsersData(Context context, List<UsersData> data){
this.context=context;
inflater= LayoutInflater.from(context);
this.data=data;
}
// Inflate the layout when viewholder created
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=inflater.inflate(R.layout.container_users, parent,false);
MyHolder holder=new MyHolder(view);
return holder;
}
// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// Get current position of item in recyclerview to bind data and assign values from list
final MyHolder myHolder= (MyHolder) holder;
final UsersData current=data.get(position);
myHolder.textFirstName.setText("First Name: " + current.fname);
myHolder.textPassword.setText("Pass: " + current.password);
myHolder.textLastName.setText("Last Name: " + current.lname);
myHolder.textEmail.setText("Email. " + current.email);
}
// return total item from List
@Override
public int getItemCount() {
return data.size();
}
class MyHolder extends RecyclerView.ViewHolder{
TextView textFirstName;
TextView textPassword;
TextView textLastName;
TextView textEmail;
// create constructor to get widget reference
public MyHolder(View itemView) {
super(itemView);
textFirstName= (TextView) itemView.findViewById(R.id.textFirstName);
textPassword = (TextView) itemView.findViewById(R.id.textPassword);
textLastName = (TextView) itemView.findViewById(R.id.textLastName);
textEmail = (TextView) itemView.findViewById(R.id.textEmail);
}
}
}
例如,我想將“ curremt.fname .......”解析為另一個活動,以向用戶顯示所單擊項目的完整詳細信息。
RecyclerViews開箱即用地提供了onclick功能。 您需要自己提供onClick功能。 長按也是如此。
理想情況下,您將使ViewHolder實現View.OnClickListener接口,並在ViewHolder的構造函數內部將其注冊為itemView的單擊偵聽器。 每當調用onClick方法時,您都可以通過調用getAdapterPostion()獲取該ViewHolder實例的位置。 這將返回一個int,該int指示View相對於Adapters數據集的位置。 從這里可以調用regisster自定義回調。 我在應用程序中所做的就是創建一個自定義onItemClick界面,該界面具有觸發方法並接收int的位置和被單擊的視圖。 我已經修改了您的代碼,以舉例說明您可以做什么。
public class AdapterUsersData extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private LayoutInflater inflater;
List<UsersData> data= Collections.emptyList();
UsersData current;
int currentPos=0;
// create constructor to innitilize context and data sent from MainActivity
public AdapterUsersData(Context context, List<UsersData> data){
this.context=context;
inflater= LayoutInflater.from(context);
this.data=data;
}
// Inflate the layout when viewholder created
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=inflater.inflate(R.layout.container_users, parent,false);
MyHolder holder=new MyHolder(view);
return holder;
}
// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// Get current position of item in recyclerview to bind data and assign values from list
final MyHolder myHolder= (MyHolder) holder;
final UsersData current=data.get(position);
myHolder.textFirstName.setText("First Name: " + current.fname);
myHolder.textPassword.setText("Pass: " + current.password);
myHolder.textLastName.setText("Last Name: " + current.lname);
myHolder.textEmail.setText("Email. " + current.email);
}
// return total item from List
@Override
public int getItemCount() {
return data.size();
}
public interface OnItemClickListener {
void onItemClicked(View v, int position);
}
private OnItemClickListener listener;
class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textFirstName;
TextView textPassword;
TextView textLastName;
TextView textEmail;
// create constructor to get widget reference
public MyHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
textFirstName= (TextView) itemView.findViewById(R.id.textFirstName);
textPassword = (TextView) itemView.findViewById(R.id.textPassword);
textLastName = (TextView) itemView.findViewById(R.id.textLastName);
textEmail = (TextView) itemView.findViewById(R.id.textEmail);
}
public void onClick(View v) {
if(listener != null) {
listener.onItemClicked(v, getAdapterPosition());
}
}
}
你可以試試..
class dapterUsersData extends RecyclerView.Adapter<dapterUsersData.ViewHolder> {
private Context context;
private LayoutInflater inflater;
List<UsersData> data = Collections.emptyList();
ArrayList<UsersData> dataSet;
public dapterUsersData(ArrayList<UsersData> data) {
this.data = data;
}
@Override
public dapterUsersData.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.container_users, null);
itemLayoutView.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
dapterUsersData.ViewHolder viewHolder = new dapterUsersData.ViewHolder(itemLayoutView);
return viewHolder;
}
@Override
public void onBindViewHolder(dapterUsersData.ViewHolder viewHolder, int i) {
UsersData current = data.get(i);
viewHolder.textFirstName.setText("First Name: " + current.getFname());
viewHolder.textPassword.setText("Pass: " + current.getPassword());
viewHolder.textLastName.setText("Last Name: " + current.getLname());
viewHolder.textEmail.setText("Email. " + current.getEmail());
viewHolder.menu = current;
}
@Override
public int getItemCount() {
return dataSet.size();
}
public void updateList(List<UsersData> temp) {
dataSet = (ArrayList<UsersData>) temp;
notifyDataSetChanged();
}
// inner class to hold a reference to each item of RecyclerView
public class ViewHolder extends RecyclerView.ViewHolder {
TextView textFirstName;
TextView textPassword;
TextView textLastName;
TextView textEmail;
public UsersData menu;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
textFirstName= (TextView) itemLayoutView.findViewById(R.id.textFirstName);
textPassword = (TextView) itemLayoutView.findViewById(R.id.textPassword);
textLastName = (TextView) itemLayoutView.findViewById(R.id.textLastName);
textEmail = (TextView) itemLayoutView.findViewById(R.id.textEmail);
itemLayoutView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// OnClick
String firstName = textFirstName.getText().toString();
}
});
}
}
}
//end Adapter
謝謝你們的幫助!
無論如何,我剛剛添加了:
myHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,current.fname.toString(),Toast.LENGTH_LONG).show();
}
});
到:public void onBindViewHolder(RecyclerView.ViewHolder持有人,int位置)方法,它起作用了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.