简体   繁体   中英

How can i solve setOnClickListener on Adapter

I have this method in a fragment

public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}

and I like to use this method in another fragment, like this

listImageAdapter.setOnItemClickListener(context);

but I got an error because the parameter is OnItemClickListener, and I look at the tutorial they used it like this, because they used it on Activity, not in the fragment

mAdapter.setOnItemClickListener(ImagesActivity.this);

so, how can I solve it?

bellow is my full code

ListFragment

public class ListFragment extends BaseFragment implements ListImageAdapter.OnItemClickListener {

    public static final String TAG = "ListFragment";

    private RecyclerView recyclerViewImages;
    private DatabaseReference databaseReference;
    private Context context;

    private List<Model> mModel;
    private ListImageAdapter listImageAdapter;
    private Variable staticVariable = new Variable();

    public ListFragment() {

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list_batik, container, false);
        findView(view);
        initView(view);
        initListener(view);
        getDataFromFirebase();
        return view;
    }

    private void getDataFromFirebase() {
        recyclerViewImages.setHasFixedSize(true);
        recyclerViewImages.setLayoutManager(new LinearLayoutManager(context));
        mModel = new ArrayList<>();
        databaseReference = FirebaseDatabase.getInstance().getReference(staticVariable.BATIK_DETECTIONS);
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot postSnapshot : dataSnapshot.getChildren()){
                    Model model = postSnapshot.getValue(Model.class);
                    mModel.add(model);
                }
                listImageAdapter = new ListImageAdapter(context, mModel);
                listImageAdapter.setOnItemClickListener(context); // this is where i got an error
                recyclerViewImages.setAdapter(listImageAdapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                simpleActivity.toastMessage(context, databaseError.getMessage());
            }
        });
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
    }

    @Override
    public void findView(View view) {
        recyclerViewImages = view.findViewById(R.id.recycleview_image);

    }

    @Override
    public void initView(View view) {

    }

    @Override
    public void initListener(View view) {

    }

    @Override
    public void OnItemClick(int position) {

    }

    @Override
    public void OnViewDescriptions(int position) {

    }

    @Override
    public void OnEditItem(int position) {

    }
}

ListImageAdapter

public class ListImageAdapter extends RecyclerView.Adapter<ListImageAdapter.ImageViewHolder>  {

    private Context context;
    private List<Model> mModels;
    private OnItemClickListener mListener;

    public ListImageAdapter(Context context, List<Model> mModels) {
        this.context = context;
        this.mModels = mModels;
    }

    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_images, viewGroup, false);
        return new ImageViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder imageViewHolder, int position) {
        Model model = mModels.get(position);
        imageViewHolder.textView.setText(model.getImageNames());
        Picasso.get()
                .load(model.getImagesUri())
                .placeholder(R.mipmap.ic_launcher)
                .fit()
                .centerCrop()
                .into(imageViewHolder.imageView);

    }

    @Override
    public int getItemCount() {
         return mModels.size();
    }

    class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,
            View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener {
        private ImageView imageView;
        private TextView textView;

        public ImageViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv_images_name);
            imageView = itemView.findViewById(R.id.list_images);

            itemView.setOnClickListener(this);
            itemView.setOnCreateContextMenuListener(this);
        }

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            if (mListener != null) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION) {

                    switch (item.getItemId()) {
                        case 1:
                            mListener.OnViewDescriptions(position);
                            return true;
                        case 2:
                            mListener.OnEditItem(position);
                            return true;
                    }
                }
            }
            return false;
        }

        @Override
        public void onClick(View v) {
            if(mListener!=null){
                int position = getAdapterPosition();
                if(position != RecyclerView.NO_POSITION){
                    mListener.OnItemClick(position);
                }
            }

        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            menu.setHeaderTitle("Select Actions");
            MenuItem ViewDescribtions = menu.add(Menu.NONE, 1, 1, "Lihat Deskripsi");
            MenuItem Edit = menu.add(Menu.NONE, 2, 2, "Edit");

            ViewDescribtions.setOnMenuItemClickListener(this);
            Edit.setOnMenuItemClickListener(this);
        }
    }

    public interface OnItemClickListener{
        void OnItemClick(int position);
        void OnViewDescriptions(int position);
        void OnEditItem(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;
    }
}

If context is defined like this

Context context;
...
...
context = this;

Then, this should not work because setOnItemClickListener is waiting for ListFragment class and not for Context .

If you set it in onCreateView of your fragment you can do it like this

listImageAdapter.setOnItemClickListener(this);

Or

listImageAdapter.setOnItemClickListener(ListFragment.this);

Your Interface,

interface ItemClickListener {
fun onItemClick(position: Int)

}

Your Adapter class,

public class InnerAdapter extends RecyclerView.Adapter<InnerAdapter.InnerViewHolder> {

private Context context;
private ItemClickListener listener;

public InnerAdapter(Context context, ItemClickListener listener) {
    this.context = context;
    this.listener = listener;
}

@NonNull
@Override
public InnerAdapter.InnerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View holder = LayoutInflater.from(context)
            .inflate(R.layout.item_inneradapter, viewGroup, false);
    return new InnerViewHolder(holder);
}

@Override
public void onBindViewHolder(@NonNull InnerViewHolder innerViewHolder, final int i) {
    innerViewHolder.textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            listener.onItemClick(i);
        }
    });
}

@Override
public int getItemCount() {
    return 20;
}


class InnerViewHolder extends RecyclerView.ViewHolder {

    public TextView textView;

    public InnerViewHolder(View itemView) {
        super(itemView);
        textView = itemView.findViewById(R.id.textView);
    }
}

}

Your Activity,

class NestedRecyclerActivity : AppCompatActivity() ,ItemClickListener{

override fun onItemClick(position: Int) {
    Log.e("yourItemClickPosition :", "" + position)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_nested_recycler)

    recyclerOuter.layoutManager = LinearLayoutManager(
        this, LinearLayoutManager.VERTICAL, false
    )
    recyclerOuter.isNestedScrollingEnabled = false
    val adapter = InnerAdapter(this,this)
    recyclerOuter.adapter = adapter
}

}

setOnItemClickListener() is defined here:

public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}

But you pass a Context argument here, when what it needs is an OnItemClickListener .

listImageAdapter.setOnItemClickListener(context);

Your Fragment implements this interface :

public class ListFragment extends BaseFragment implements ListImageAdapter.OnItemClickListener

So you can just pass this as an argument (where this referes to the current instance of the Fragment):

listImageAdapter.setOnItemClickListener(this);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM