无法解析 RecyclerView 的方法 setOnItemClickListener
Cannot resolve method setOnItemClickListener for RecyclerView
我正在使用 RecyclerView,我正在尝试为 RecyclerView 中的每个项目设置 OnClick 和 OnLongClick。抱歉,但我不认为我 真正 了解代码的情况,其中一些代码已从我的作业幻灯片中删除,一些补丁用于无法正常工作的内容我在这个网站上找到的。在我的 RecyclerView 适配器 class 的顶部,我有
static OnItemClickListener mItemClickListener;` 然后我有一个新方法的接口,一个设置我的 clicklistener 的方法,然后是我的 ViewHolder 实现,如下所示:
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView movieImage;
public TextView movieName;
public TextView movieDescription;
public CheckBox movieCheckBox;
public CardView cV;
public ViewHolder(View view) {
super(view);
movieImage = (ImageView) view.findViewById(R.id.movieImg);
movieName = (TextView) view.findViewById(R.id.movieName);
movieDescription = (TextView) view.findViewById(R.id.movieDescription);
movieCheckBox = (CheckBox) view.findViewById(R.id.movieCheckBox);
view.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if (mItemClickListener != null) {
if (getAdapterPosition() != RecyclerView.NO_POSITION) {
mItemClickListener.onItemClick(v, getAdapterPosition());
}
}
}
});
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mItemClickListener != null) {
if (getAdapterPosition() != RecyclerView.NO_POSITION) {
mItemClickListener.onItemLongClick(v, getAdapterPosition());
}
}
return true;
}
});
}
}
我的问题出现在我的片段 class 中,该片段拥有回收器视图,我试图在其中设置 onitemclicklistener。
myAdapter = new MyRecyclerAdapter();
myAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.d("TEST", "onItemClick");
}
@Override
public void onItemLongClick(View view, int position) {
Log.d("TEST", "onItemLongClick");
}
});
它说问题出在 myAdapter.setOnItemClickListener
它说
'Cannot resolve method 'setOnItemClickListener(anonymous com.example.kevin.assignment4.MyRecyclerAdapter.OnItemClickListener)'
但我不知道它为什么这么说。据我所知,它应该能够很好地找到方法。
编辑:我对 MyRecyclerView class 的导入如下:
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.HashMap;
我试过同样的东西,而且效果很好。检查这个。
public class MyFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener{
private MyAdapter mAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
setHasOptionsMenu(true);
//init views
final View root = inflater.inflate(R.layout.layout, container, false);
RecyclerView rv = (RecyclerView) root.findViewById(R.id.recyclerview);
mAdapter = new MyAdapter(getActivity(), data);
mAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(getActivity(), "Working...", Toast.LENGTH_LONG).show();
}
});
rv.setAdapter(mAdapter);
rv.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL));
return root;
}
public interface OnItemClickListener{
void onItemClick(View view, int position);
}
private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<Data> data;
private Context mContext;
MyAdapter(Context context, ArrayList<Data> data) {
this.data = data;
}
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener = onItemClickListener;
}
class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
MyHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(onItemClickListener != null){
onItemClickListener.onItemClick(v, getAdapterPosition());
}
}
}
}
}
所以我不确定为什么我原来的方法不起作用,因为我在网上看到过类似的方法,甚至这里发布的其中一个答案也是如此。我通过更改适配器 class 的结构解决了我的问题,以便它将侦听器作为参数传递给 RecyclerView 适配器的构造函数。在那里,我将 class 中的监听器设置为等于进来的监听器。
public MyRecyclerAdapter(ClickListener clickListener) {
setClickListener(clickListener);
}
然后在我创建 recyclerview 的片段中
myAdapter = new MyRecyclerAdapter(this);
我的片段 class 从我的适配器 class 实现接口。
不小心将您的适配器声明为 RecyclerView.Adapter 而不是您的自定义适配器 MyRecyclerAdapter() 是一个可能的原因。
RecyclerView.Adapter adapter = new MyRecyclerAdapter()
而不是,
MyRecyclerAdapter adapter = new MyRecyclerAdapter()
我遇到了类似的问题。这段代码解决了我的 problem.Its 来不及回答了,但是这段代码的工作原理就像 magic.This 是我的 java class。
package app.android.dgconnect.activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import app.android.dgconnect.R;
import app.android.dgconnect.adapters.AddressBookAdapter;
import app.android.dgconnect.models.CustomersProfileModel;
public class AddressBookMain extends AppCompatActivity implements AdapterView.OnItemClickListener {
private List<CustomersProfileModel> itemList = new ArrayList<>();
private AddressBookAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.address_book_layout);
CustomersProfileModel customersProfileModel=getIntent().getParcelableExtra("customerProfileModel");
TextView title = findViewById(R.id.title);
ImageView toolbar_back = findViewById(R.id.toolbar_back);
title.setText("Address");
toolbar_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
RecyclerView recyclerView = findViewById(R.id.recycler_view);
mAdapter = new AddressBookAdapter(itemList,this);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), LinearLayoutManager.HORIZONTAL));
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
for(int i=0;i<customersProfileModel.addresses.size();i++){
itemList.add(customersProfileModel);
mAdapter.notifyDataSetChanged();
}
mAdapter.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
}
这是我的适配器 class :
package app.android.dgconnect.adapters;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.RadioButton;
import android.widget.TextView;
import java.util.List;
import app.android.dgconnect.R;
import app.android.dgconnect.models.CustomersProfileModel;
public class AddressBookAdapter extends RecyclerView.Adapter<AddressBookAdapter.SingleCheckViewHolder> {
private List<CustomersProfileModel> itemList;
private int mSelectedItem = -1;
private Context mContext;
private AdapterView.OnItemClickListener onItemClickListener;
public AddressBookAdapter(List<CustomersProfileModel> itemList, Context context) {
this.itemList = itemList;
this.mContext = context;
}
@NonNull
@Override
public SingleCheckViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(mContext);
final View view = inflater.inflate(R.layout.address_book_list_row, viewGroup, false);
return new SingleCheckViewHolder(view, this);
}
@Override
public void onBindViewHolder(@NonNull final SingleCheckViewHolder holder, final int position) {
CustomersProfileModel items = itemList.get(position);
holder.address.setText(items.addresses.get(position).street.get(0));
String rname = items.addresses.get(position).region.region;
String pcode = items.addresses.get(position).postcode;
if (rname.equals("string")) {
holder.address_line_two.setText(pcode);
} else {
holder.address_line_two.setText(rname + ", " + pcode);
}
try {
holder.setDateToView(items, position);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public int getItemCount() {
return itemList.size();
}
public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public void onItemHolderClick(SingleCheckViewHolder holder) {
if (onItemClickListener != null)
onItemClickListener.onItemClick(null, holder.itemView, holder.getAdapterPosition(), holder.getItemId());
}
class SingleCheckViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private AddressBookAdapter mAdapter;
private RadioButton radioButton;
private TextView address, address_line_two;
public SingleCheckViewHolder(View itemView, final AddressBookAdapter mAdapter) {
super(itemView);
this.mAdapter = mAdapter;
address = itemView.findViewById(R.id.address);
address_line_two = itemView.findViewById(R.id.address_line_two);
radioButton = itemView.findViewById(R.id.radioButton);
itemView.setOnClickListener(this);
radioButton.setOnClickListener(this);
}
public void setDateToView(CustomersProfileModel item, int position) throws Exception {
radioButton.setChecked(position == mSelectedItem);
// mText.setText(item.getPersonName());
}
@Override
public void onClick(View v) {
mSelectedItem = getAdapterPosition();
notifyItemRangeChanged(0, itemList.size());
mAdapter.onItemHolderClick(SingleCheckViewHolder.this);
}
}
}
我来晚了,但这可能对某人有所帮助;在尝试使用来自 activity 的适配器的自定义方法时,我遇到了同样的“无法解析符号”问题(为了在 Java,使用 Android Studio 3.3.2)。
令人困惑的是,尽管如此,与此同时,对于我的适配器实例,基础 class RecyclerView.Adapter 自己的方法(例如 getItemCount 和onBindViewHolder ) 可解析。
我的问题是我的代码与 Kevin 的代码相似,其中 Kevin 在他的片段中有:
myAdapter = new MyRecyclerAdapter();
而解决我的问题的是我在实例化适配器时忽略了简单地指定类型 - 例如:
MyRecyclerAdapter myAdapter = new MyRecyclerAdapter();
...'无法解析符号'然后成为过去,我能够访问我的自定义适配器方法,例如 setOnItemClickedListener.
我正在使用 RecyclerView,我正在尝试为 RecyclerView 中的每个项目设置 OnClick 和 OnLongClick。抱歉,但我不认为我 真正 了解代码的情况,其中一些代码已从我的作业幻灯片中删除,一些补丁用于无法正常工作的内容我在这个网站上找到的。在我的 RecyclerView 适配器 class 的顶部,我有
static OnItemClickListener mItemClickListener;` 然后我有一个新方法的接口,一个设置我的 clicklistener 的方法,然后是我的 ViewHolder 实现,如下所示:
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView movieImage;
public TextView movieName;
public TextView movieDescription;
public CheckBox movieCheckBox;
public CardView cV;
public ViewHolder(View view) {
super(view);
movieImage = (ImageView) view.findViewById(R.id.movieImg);
movieName = (TextView) view.findViewById(R.id.movieName);
movieDescription = (TextView) view.findViewById(R.id.movieDescription);
movieCheckBox = (CheckBox) view.findViewById(R.id.movieCheckBox);
view.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if (mItemClickListener != null) {
if (getAdapterPosition() != RecyclerView.NO_POSITION) {
mItemClickListener.onItemClick(v, getAdapterPosition());
}
}
}
});
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mItemClickListener != null) {
if (getAdapterPosition() != RecyclerView.NO_POSITION) {
mItemClickListener.onItemLongClick(v, getAdapterPosition());
}
}
return true;
}
});
}
}
我的问题出现在我的片段 class 中,该片段拥有回收器视图,我试图在其中设置 onitemclicklistener。
myAdapter = new MyRecyclerAdapter();
myAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.d("TEST", "onItemClick");
}
@Override
public void onItemLongClick(View view, int position) {
Log.d("TEST", "onItemLongClick");
}
});
它说问题出在 myAdapter.setOnItemClickListener
它说 'Cannot resolve method 'setOnItemClickListener(anonymous com.example.kevin.assignment4.MyRecyclerAdapter.OnItemClickListener)'
但我不知道它为什么这么说。据我所知,它应该能够很好地找到方法。
编辑:我对 MyRecyclerView class 的导入如下:
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.HashMap;
我试过同样的东西,而且效果很好。检查这个。
public class MyFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener{
private MyAdapter mAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
setHasOptionsMenu(true);
//init views
final View root = inflater.inflate(R.layout.layout, container, false);
RecyclerView rv = (RecyclerView) root.findViewById(R.id.recyclerview);
mAdapter = new MyAdapter(getActivity(), data);
mAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(getActivity(), "Working...", Toast.LENGTH_LONG).show();
}
});
rv.setAdapter(mAdapter);
rv.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL));
return root;
}
public interface OnItemClickListener{
void onItemClick(View view, int position);
}
private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<Data> data;
private Context mContext;
MyAdapter(Context context, ArrayList<Data> data) {
this.data = data;
}
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener = onItemClickListener;
}
class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
MyHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(onItemClickListener != null){
onItemClickListener.onItemClick(v, getAdapterPosition());
}
}
}
}
}
所以我不确定为什么我原来的方法不起作用,因为我在网上看到过类似的方法,甚至这里发布的其中一个答案也是如此。我通过更改适配器 class 的结构解决了我的问题,以便它将侦听器作为参数传递给 RecyclerView 适配器的构造函数。在那里,我将 class 中的监听器设置为等于进来的监听器。
public MyRecyclerAdapter(ClickListener clickListener) {
setClickListener(clickListener);
}
然后在我创建 recyclerview 的片段中
myAdapter = new MyRecyclerAdapter(this);
我的片段 class 从我的适配器 class 实现接口。
不小心将您的适配器声明为 RecyclerView.Adapter 而不是您的自定义适配器 MyRecyclerAdapter() 是一个可能的原因。
RecyclerView.Adapter adapter = new MyRecyclerAdapter()
而不是,
MyRecyclerAdapter adapter = new MyRecyclerAdapter()
我遇到了类似的问题。这段代码解决了我的 problem.Its 来不及回答了,但是这段代码的工作原理就像 magic.This 是我的 java class。
package app.android.dgconnect.activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import app.android.dgconnect.R;
import app.android.dgconnect.adapters.AddressBookAdapter;
import app.android.dgconnect.models.CustomersProfileModel;
public class AddressBookMain extends AppCompatActivity implements AdapterView.OnItemClickListener {
private List<CustomersProfileModel> itemList = new ArrayList<>();
private AddressBookAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.address_book_layout);
CustomersProfileModel customersProfileModel=getIntent().getParcelableExtra("customerProfileModel");
TextView title = findViewById(R.id.title);
ImageView toolbar_back = findViewById(R.id.toolbar_back);
title.setText("Address");
toolbar_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
RecyclerView recyclerView = findViewById(R.id.recycler_view);
mAdapter = new AddressBookAdapter(itemList,this);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), LinearLayoutManager.HORIZONTAL));
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
for(int i=0;i<customersProfileModel.addresses.size();i++){
itemList.add(customersProfileModel);
mAdapter.notifyDataSetChanged();
}
mAdapter.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
}
这是我的适配器 class :
package app.android.dgconnect.adapters;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.RadioButton;
import android.widget.TextView;
import java.util.List;
import app.android.dgconnect.R;
import app.android.dgconnect.models.CustomersProfileModel;
public class AddressBookAdapter extends RecyclerView.Adapter<AddressBookAdapter.SingleCheckViewHolder> {
private List<CustomersProfileModel> itemList;
private int mSelectedItem = -1;
private Context mContext;
private AdapterView.OnItemClickListener onItemClickListener;
public AddressBookAdapter(List<CustomersProfileModel> itemList, Context context) {
this.itemList = itemList;
this.mContext = context;
}
@NonNull
@Override
public SingleCheckViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(mContext);
final View view = inflater.inflate(R.layout.address_book_list_row, viewGroup, false);
return new SingleCheckViewHolder(view, this);
}
@Override
public void onBindViewHolder(@NonNull final SingleCheckViewHolder holder, final int position) {
CustomersProfileModel items = itemList.get(position);
holder.address.setText(items.addresses.get(position).street.get(0));
String rname = items.addresses.get(position).region.region;
String pcode = items.addresses.get(position).postcode;
if (rname.equals("string")) {
holder.address_line_two.setText(pcode);
} else {
holder.address_line_two.setText(rname + ", " + pcode);
}
try {
holder.setDateToView(items, position);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public int getItemCount() {
return itemList.size();
}
public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public void onItemHolderClick(SingleCheckViewHolder holder) {
if (onItemClickListener != null)
onItemClickListener.onItemClick(null, holder.itemView, holder.getAdapterPosition(), holder.getItemId());
}
class SingleCheckViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private AddressBookAdapter mAdapter;
private RadioButton radioButton;
private TextView address, address_line_two;
public SingleCheckViewHolder(View itemView, final AddressBookAdapter mAdapter) {
super(itemView);
this.mAdapter = mAdapter;
address = itemView.findViewById(R.id.address);
address_line_two = itemView.findViewById(R.id.address_line_two);
radioButton = itemView.findViewById(R.id.radioButton);
itemView.setOnClickListener(this);
radioButton.setOnClickListener(this);
}
public void setDateToView(CustomersProfileModel item, int position) throws Exception {
radioButton.setChecked(position == mSelectedItem);
// mText.setText(item.getPersonName());
}
@Override
public void onClick(View v) {
mSelectedItem = getAdapterPosition();
notifyItemRangeChanged(0, itemList.size());
mAdapter.onItemHolderClick(SingleCheckViewHolder.this);
}
}
}
我来晚了,但这可能对某人有所帮助;在尝试使用来自 activity 的适配器的自定义方法时,我遇到了同样的“无法解析符号”问题(为了在 Java,使用 Android Studio 3.3.2)。
令人困惑的是,尽管如此,与此同时,对于我的适配器实例,基础 class RecyclerView.Adapter 自己的方法(例如 getItemCount 和onBindViewHolder ) 可解析。
我的问题是我的代码与 Kevin 的代码相似,其中 Kevin 在他的片段中有:
myAdapter = new MyRecyclerAdapter();
而解决我的问题的是我在实例化适配器时忽略了简单地指定类型 - 例如:
MyRecyclerAdapter myAdapter = new MyRecyclerAdapter();
...'无法解析符号'然后成为过去,我能够访问我的自定义适配器方法,例如 setOnItemClickedListener.