Cannot cast onItem clicklistener inside Fragment Class form Adapter Class

左心房为你撑大大i 提交于 2019-12-13 08:03:12

问题


I have an Fragment with recycleview where I populate it with json items from internet. It load fine and Next step I want to is open new Activity when any row is clicked. It works in activity, thus I modified the same code for fragment but for fragment it throws exception in line

       mExampleAdapter.setOnItemClickListener(getActivity());

with errror setOnItemClickListener of refrence adatper cannot be applied to Fragment activty and thus when I change line to

(ExampleAdapter.OnItemClickListener) 

and when i build and run . Then app crashes with error that Mainactivity which holds framgnet cannot be cast in to .ExampleAdapter$OnItemClickListener

Here is my whole Fragment class

public class Mynotes extends Fragment implements ExampleAdapter.OnItemClickListener{

    public static final String YTD_LINK = "link";
    private RecyclerView mRecyclerView;
    private ExampleAdapter mExampleAdapter;
    private ArrayList<ExampleItem> mExampleList;
    private RequestQueue mRequestQueue;
    String url="https://api.myjson.com/bins/16mecx";

    public Mynotes() {


    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.activity_jsonfeed, container, false);




        mRecyclerView = view.findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRecyclerView.addItemDecoration(new MyDividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL, 36));

        mExampleList = new ArrayList<>();
        mExampleAdapter = new ExampleAdapter(getActivity(), mExampleList);
        mRecyclerView.setAdapter(mExampleAdapter);
        mExampleAdapter.setOnItemClickListener((ExampleAdapter.OnItemClickListener) getActivity());
 



     
        parseJSON();



        return view;
    }

  

    private void parseJSON() {

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {

                        myProgressBar.setVisibility(View.GONE);

                        try {
                            JSONArray jsonArray = response.getJSONArray("hits");

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject hit = jsonArray.getJSONObject(i);
                                String videoTitle = hit.getString("title");
                                String link = hit.getString("link");


                                mExampleList.add(new ExampleItem(videoTitle, link));
                                mExampleAdapter.notifyDataSetChanged();
                            }


                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            
            }
        });

        mRequestQueue.add(request);
    }

    @Override
    public void onItemClick(int position) {
        Intent intent = new Intent(getActivity(), NewActiviyt.class);
        ExampleItem clickedItem = mExampleList.get(position);
            intent.putExtra(YTD_LINK, clickedItem.getmLink());
            startActivity(intent);


    }

    @Override
    public void onRefresh() {

    }
}

and my Adapter Class is

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
    private Context mContext;
    private ArrayList<ExampleItem> mExampleList;
    private OnItemClickListener mListener;



    public interface OnItemClickListener {
        void onItemClick(int position);
    }

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



    public ExampleAdapter(Context context, ArrayList<ExampleItem> exampleList) {
        mContext = context;
        mExampleList = exampleList;
    }

    @Override
    public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.example_item, parent, false);
        return new ExampleViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ExampleViewHolder holder, int position) {
        ExampleItem currentItem = mExampleList.get(position);


         String title = currentItem.getTitle();
//        int likeCount = currentItem.getLikeCount();
//        String imageUrl = currentItem.getImageUrl();

          holder.mTextViewCreator.setText(title);
//        holder.mTextViewLikes.setText("Likes: " + likeCount);
//        Glide.with(mContext).load(imageUrl).apply(RequestOptions.circleCropTransform()).into(holder.mImageView);

    }

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

    public class ExampleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        public TextView mTextViewCreator;
//        public TextView mTextViewLikes;
//        public ImageView mImageView;

        public ExampleViewHolder(View itemView) {
            super(itemView);
//            mTextViewLikes = itemView.findViewById(R.id.text_view_likes);
//            mImageView = itemView.findViewById(R.id.image_view);
            mTextViewCreator = itemView.findViewById(R.id.text_title);


        }

        @Override
        public void onClick(View view) {

            if (mListener != null) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION) {
                    mListener.onItemClick(position);
                }
            }

        }
    }
}

Thanks in advance.


回答1:


replace getActivity with getContext when you work in fragment,

You can read more here

What is different between getContext and getActivity from Fragment in support library?




回答2:


Your activity should implement ExampleAdapter.OnItemClickListener



来源:https://stackoverflow.com/questions/57246997/cannot-cast-onitem-clicklistener-inside-fragment-class-form-adapter-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!