Java 带有CustomAdapter的片段中有多个OnClick侦听器
问题:我试图通过浮动操作按钮在回收器视图的每个项目中实现三个不同的Java 带有CustomAdapter的片段中有多个OnClick侦听器,java,android,android-recyclerview,android-arrayadapter,Java,Android,Android Recyclerview,Android Arrayadapter,问题:我试图通过浮动操作按钮在回收器视图的每个项目中实现三个不同的OnClickListeners。三个晶圆厂中的每一个都有不同的功能,因此它们需要不同的OnClickListeners。我想我可以用当前的适配器设置实例化一个,但我希望能够通过如下方式访问片段中的所有三个: mRecyclerView2.addItemDecoration(itemDecoration2); mLayoutManager2 = new GridLayoutManager(mContext, 3);
OnClickListeners
。三个晶圆厂中的每一个都有不同的功能,因此它们需要不同的OnClickListeners
。我想我可以用当前的适配器设置实例化一个,但我希望能够通过如下方式访问片段中的所有三个:
mRecyclerView2.addItemDecoration(itemDecoration2);
mLayoutManager2 = new GridLayoutManager(mContext, 3);
mRecyclerView2.setLayoutManager(mLayoutManager2);
mAdapter2 = new photo_adapter2(mContext, arrayList2);
mRecyclerView2.setAdapter(mAdapter2);
mAdapter2.floatingActionButtonDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = mRecyclerView2.getChildAdapterPosition(v);
photo_item2 item = mAdapter2.getDataSet().get(position);
final String key = item.getMatchId();
}
});
mAdapter2.floatingActionButtonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = mRecyclerView2.getChildAdapterPosition(v);
photo_item2 item = mAdapter2.getDataSet().get(position);
final String key = item.getMatchId();
}
});
mAdapter2.floatingActionButtonChat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = mRecyclerView2.getChildAdapterPosition(v);
photo_item2 item = mAdapter2.getDataSet().get(position);
final String key = item.getMatchId();
}
});
public class MainActivity extends AppCompatActivity implements OnFabClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// declare and initialize the recyclerview
RecyclerView rcView = ......
// declare and initialize the requiredadapter
photo_adapter2 adapter = .....
// set the data using setDataSet() or you can skip this if you
// already passed the dataset in the constructor
adapter.setDataSet(yourDataSet);
// set this class as the onFabClickListener(you forgot this one I guess)
adapter.setOnFabClickListener(this);
// set the adapter to the recyclerview
rcView.setAdapter(adapter);
}
@Override
public void onFabClick(View view, int position) {
int id = view.getId();
switch (id) {
case R.id.floatingActionButtonDelete:
// you can now do your stuff here
break;
case R.id.floatingActionButtonChat:
// for eg get the item associated with the viewholder of whose fab was clicked
photo_item2 item = mAdapter2.getDataSet().get(position);
break;
case R.id.floatingActionButtonView:
break;
}
}
}
当我移动到片段时,出现以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.material.floatingactionbutton.FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.firetest.Tabs.MatchProcess.MatchFragment.onCreateView
适配器:
public class photo_adapter2 extends RecyclerView.Adapter<photo_adapter2.ViewHolder> {
ImageView imageView;
FloatingActionButton floatingActionButtonDelete;
FloatingActionButton floatingActionButtonChat;
FloatingActionButton floatingActionButtonView;
private Uri imageUri;
private ArrayList<photo_item2> mDataSet;
private Context mContext;
private OnItemClickListener mListener;
public ArrayList<photo_item2> getDataSet() {
return mDataSet;
}
public void setDataSet(ArrayList<photo_item2> mDataSet) {
this.mDataSet = mDataSet;
}
public ImageView getImageView() {
return imageView;
}
public void setImageView(ImageView imageView) {
this.imageView = imageView;
}
public Context getContext() {
return mContext;
}
public void setContext(Context mContext) {
this.mContext = mContext;
}
public Uri getImageUri() {
return imageUri;
}
public void setImageUri(Uri imageUri) {
this.imageUri = imageUri;
}
public interface OnItemClickListener {
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
public photo_adapter2(Context context, ArrayList<photo_item2> DataSet) {
mDataSet = DataSet;
mContext = context;
}
public ArrayList<photo_item2> DataSet() {
return mDataSet;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView mImageView;
public FloatingActionButton floatingActionButtonDelete;
public FloatingActionButton floatingActionButtonView;
public FloatingActionButton floatingActionButtonChat;
public RelativeLayout mLinearLayout;
private int adapterPositionOnCLick;
public ViewHolder(View v, final OnItemClickListener listener) {
super(v);
mImageView = (ImageView) v.findViewById(R.id.tv);
floatingActionButtonDelete = (FloatingActionButton) v.findViewById(R.id.floatingActionButtonDelete);
floatingActionButtonChat = (FloatingActionButton) v.findViewById(R.id.floatingActionButtonChat);
floatingActionButtonView = (FloatingActionButton) v.findViewById(R.id.floatingActionButtonView);
floatingActionButtonDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
adapterPositionOnCLick = getAdapterPosition();
if (adapterPositionOnCLick != RecyclerView.NO_POSITION) ;
listener.onItemClick(adapterPositionOnCLick);
}
}
});
floatingActionButtonChat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
adapterPositionOnCLick = getAdapterPosition();
if (adapterPositionOnCLick != RecyclerView.NO_POSITION) ;
listener.onItemClick(adapterPositionOnCLick);
}
}
});
floatingActionButtonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
adapterPositionOnCLick = getAdapterPosition();
if (adapterPositionOnCLick != RecyclerView.NO_POSITION) ;
listener.onItemClick(adapterPositionOnCLick);
}
}
});
mLinearLayout = (RelativeLayout) v.findViewById(R.id.ll);
}
public ImageView getImageView() {
return mImageView;
}
public void setImageView(ImageView mImageView) {
this.mImageView = mImageView;
}
}
@Override
public photo_adapter2.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(mContext).inflate(R.layout.photo_custom_view_card, parent, false);
ViewHolder vh = new ViewHolder(v, (OnItemClickListener) mListener);
return vh;
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final photo_item2 photo_item = mDataSet.get(position);
}
@Override
public int getItemCount() {
return mDataSet.size();
}
}
公共类照片适配器2扩展了RecyclerView.Adapter{
图像视图图像视图;
浮动操作按钮浮动操作按钮删除;
浮动操作按钮浮动操作按钮;
浮动操作按钮浮动操作按钮视图;
私有Uri-imageUri;
私有ArrayList数据集;
私有上下文;
私人监听者;
公共ArrayList getDataSet(){
返回mDataSet;
}
公共void setDataSet(ArrayList mDataSet){
this.mDataSet=mDataSet;
}
公共图像视图getImageView(){
返回图像视图;
}
public void setImageView(ImageView ImageView){
this.imageView=imageView;
}
公共上下文getContext(){
返回mContext;
}
public void setContext(Context mContext){
this.mContext=mContext;
}
公共Uri getImageUri(){
返回imageUri;
}
public void setImageUri(Uri imageUri){
this.imageUri=imageUri;
}
公共接口侦听器{
无效单击(内部位置);
}
公共void setOnItemClickListener(OnItemClickListener侦听器){
mListener=监听器;
}
公共照片适配器2(上下文,ArrayList数据集){
mDataSet=数据集;
mContext=上下文;
}
公共ArrayList数据集(){
返回mDataSet;
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共图像视图mImageView;
公共浮动操作按钮浮动操作按钮删除;
公共浮动操作按钮浮动操作按钮视图;
公共浮动操作按钮浮动操作按钮;
公共关系布局;
私人int适配器位置单击;
公共视图持有者(视图v,最终侦听器){
超级(五);
mImageView=(ImageView)v.findViewById(R.id.tv);
floatingActionButtonDelete=(FloatingActionButton)v.findViewById(R.id.floatingActionButtonDelete);
floatingActionButtonChat=(FloatingActionButton)v.findViewById(R.id.floatingActionButtonChat);
floatingActionButtonView=(FloatingActionButton)v.findViewById(R.id.floatingActionButtonView);
floatingActionButtonDelete.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(侦听器!=null){
adapterPositionOnCLick=getAdapterPosition();
if(适配器位置单击!=RecyclerView.NO_位置);
listener.onItemClick(adapterPositionOnCLick);
}
}
});
floatingActionButtonChat.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(侦听器!=null){
adapterPositionOnCLick=getAdapterPosition();
if(适配器位置单击!=RecyclerView.NO_位置);
listener.onItemClick(adapterPositionOnCLick);
}
}
});
floatingActionButtonView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(侦听器!=null){
adapterPositionOnCLick=getAdapterPosition();
if(适配器位置单击!=RecyclerView.NO_位置);
listener.onItemClick(adapterPositionOnCLick);
}
}
});
mLinearLayout=(RelativeLayout)v.findViewById(R.id.ll);
}
公共图像视图getImageView(){
返回图像视图;
}
public void setImageView(ImageView mImageView){
this.mImageView=mImageView;
}
}
@凌驾
公共照片适配器2.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=布局更平坦。从(mContext)。充气(R.layout.photo\u custom\u View\u card,父级,false);
ViewHolder vh=新的ViewHolder(v,(OnItemClickListener)mListener);
返回vh;
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
最终照片项目2照片项目=mDataSet.get(位置);
}
@凌驾
public int getItemCount(){
返回mDataSet.size();
}
}
我怎样才能像这样创建三个onClickListeners
?我应该如何修改当前的片段和适配器设置来实现这一点?请让我知道,如果有什么我应该添加到我的职位
检查创建所有三个浮动操作按钮的XML文件,确保所有按钮都已创建,并带有从视图访问的相应名称。NullPointerException告诉您,您的一个浮动操作按钮指向了一些尚不存在的东西。我想,您可以在FabClickListener上创建一个
界面
以将浮动操作按钮
上的原始onClick
事件分派到您的活动
或片段
。如果三个FloatingActionButtons
是与
public class photo_adapter2 extends RecyclerView.Adapter<photo_adapter2.ViewHolder> {
// you all other variable declarations
private ArrayList<photo_item2> mDataSet;
private Context mContext;
private OnFabClickListener mListener;
// your all other required methods definition
public void setOnFabClickListener(OnFabClickListener listener) {
mListener = listener;
}
public ArrayList<photo_item2> getDataSet() {
return mDataSet;
}
public void setDataSet(ArrayList<photo_item2> mDataSet) {
this.mDataSet = mDataSet;
}
public photo_adapter2(Context context) {
mContext = context;
}
@NonNull
@Override
public photo_adapter2.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(mContext).inflate(R.layout.photo_custom_view_card, parent, false);
return new ViewHolder(v, mListener);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
final photo_item2 photo_item = mDataSet.get(position);
// do you stuff here
}
@Override
public int getItemCount() {
return mDataSet.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private OnFabClickListener listener;
public ViewHolder(View v, final OnFabClickListener listener) {
super(v);
// your all other view initialization
//setting our listener object
this.listener = listener;
// your all other views declaration
FloatingActionButton floatingActionButtonDelete = v.findViewById(R.id.floatingActionButtonDelete);
FloatingActionButton floatingActionButtonChat = v.findViewById(R.id.floatingActionButtonChat);
FloatingActionButton floatingActionButtonView = v.findViewById(R.id.floatingActionButtonView);
// setting onclicklisteners on them
// our view holder class is gonna handle all of the onclick
floatingActionButtonDelete.setOnClickListener(this);
floatingActionButtonChat.setOnClickListener(this);
floatingActionButtonView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
// if the view is a floating action button and listener is not equal to null
if (view instanceof FloatingActionButton && listener != null) {
if (getAdapterPosition() != RecyclerView.NO_POSITION) {
// for every on click listened here we will dispatch it to our activity or fragment which
// is required to respond to those events
listener.onFabClick(view, getAdapterPosition());
}
}
}
// your all other methods definition
}
}
public class MainActivity extends AppCompatActivity implements OnFabClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// declare and initialize the recyclerview
RecyclerView rcView = ......
// declare and initialize the requiredadapter
photo_adapter2 adapter = .....
// set the data using setDataSet() or you can skip this if you
// already passed the dataset in the constructor
adapter.setDataSet(yourDataSet);
// set this class as the onFabClickListener(you forgot this one I guess)
adapter.setOnFabClickListener(this);
// set the adapter to the recyclerview
rcView.setAdapter(adapter);
}
@Override
public void onFabClick(View view, int position) {
int id = view.getId();
switch (id) {
case R.id.floatingActionButtonDelete:
// you can now do your stuff here
break;
case R.id.floatingActionButtonChat:
// for eg get the item associated with the viewholder of whose fab was clicked
photo_item2 item = mAdapter2.getDataSet().get(position);
break;
case R.id.floatingActionButtonView:
break;
}
}
}