【问题标题】:ItemClickListener not working in Fragment RecyclerView with onclickItemClickListener 在带有 onclick 的 Fragment RecyclerView 中不起作用
【发布时间】:2018-10-21 21:31:15
【问题描述】:

我一直在关注本教程:Tutorial 使用 onclick 制作一个 json recyclerviewer,但我想使用 Fragments 而不是活动。

直到 onClick 点我都已经弄清楚了。

我的问题是 setOnItemClickListener 没有占用我的 getActivity() 我已经尝试了很多,但我就是看不到亮光。

如果有人可以帮助我,那就太棒了!

我唯一真正的问题是 getActivity 在:

fNieuwsAdapter.setOnItemClickListener(getActivity());

NieuwsFragment.java

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;

    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;

    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.JsonObjectRequest;
    import com.android.volley.toolbox.Volley;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    import org.jsoup.Jsoup;

    import java.util.ArrayList;

    public class NieuwsFragment extends Fragment implements NieuwsAdapter.OnItemClickListener {
        public static final String EXTRA_URL = "nieuwsImageUrl";
        public static final String EXTRA_HEADING = "nieuwsHeading";
        public static final String EXTRA_CONTENT = "nieuwsContent";

        private RecyclerView fNieuwsRecyclerView;
        private NieuwsAdapter fNieuwsAdapter;
        private ArrayList<NieuwsItem> fNieuwsList;
        private RequestQueue fNieuwsQueue;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_nieuws, container, false);
            fNieuwsRecyclerView = view.findViewById(R.id.recycler_view);
            fNieuwsRecyclerView.setHasFixedSize(true);
            fNieuwsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

            fNieuwsList = new ArrayList<>();

            fNieuwsQueue = Volley.newRequestQueue(getActivity());
            parseJSON();
            return view;
        }

        private void parseJSON() {
            String url = "urlissecretsorry<3butthejsonparsingworks";

            JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                    new Response.Listener<JSONObject>() {
                        public String nieuwsImageUrl;
                        @Override
                        public void onResponse(JSONObject response) {
                            try {
                                JSONArray jsonArray = response.getJSONArray("posts");

                                for (int i = 0; i < jsonArray.length(); i++) {
                                    JSONObject hit = jsonArray.getJSONObject(i);
                                    JSONArray attachArray = hit.getJSONArray("attachments");
                                    for (int a = 0; a < attachArray.length(); a++) {
                                        JSONObject attach = attachArray.getJSONObject(a);
                                        nieuwsImageUrl = attach.getString("url");
                                    }

                                    String nieuwsHeading = hit.getString("title");
                                    String nieuwsExcerpt = hit.getString("excerpt");
                                    String nieuwsContent = hit.getString("content");
                                    nieuwsExcerpt = html2text(nieuwsExcerpt);


                                    fNieuwsList.add(new NieuwsItem(nieuwsImageUrl, nieuwsHeading, nieuwsExcerpt,nieuwsContent));
                                }

                                fNieuwsAdapter = new NieuwsAdapter(getActivity(), fNieuwsList);
                                fNieuwsAdapter.setOnItemClickListener(getActivity());
                                fNieuwsRecyclerView.setAdapter(fNieuwsAdapter);

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

            fNieuwsQueue.add(request);
        }
        @Override
        public void onItemClick(int position) {
            Intent detailIntent = new Intent(getActivity(), DetailActivity.class);
            NieuwsItem clickedItem = fNieuwsList.get(position);

            detailIntent.putExtra(EXTRA_URL, clickedItem.getImageUrl());
            detailIntent.putExtra(EXTRA_HEADING, clickedItem.getHeading());
            detailIntent.putExtra(EXTRA_CONTENT, clickedItem.getContent());

            startActivity(detailIntent);
        }

        public String html2text(String html) {
            try {
                return Jsoup.parse(html).text();
            } catch (Exception ignored) {
                return "";
            }
        }
    }

NieuwsItem.java

    public class NieuwsItem {
        private String nieuwsImageUrl;
        private String nieuwsHeading;
        private String nieuwsExcerpt;
        private String nieuwsContent;

        public NieuwsItem(String imageUrl, String heading, String excerpt, String content){
            nieuwsImageUrl = imageUrl;
            nieuwsHeading = heading;
            nieuwsExcerpt = excerpt;
            nieuwsContent = content;
        }

        public String getImageUrl(){
            return nieuwsImageUrl;
        }
        public String getHeading(){
            return nieuwsHeading;
        }
        public String getExcerpt(){
            return nieuwsExcerpt;
        }
        public String getContent(){
            return nieuwsContent;
        }
    }

NieuwsAdapter.java

 import android.content.Context;
    import android.support.annotation.NonNull;
    import android.support.v7.widget.RecyclerView;
    import android.support.v4.app.FragmentActivity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;

    import com.squareup.picasso.Picasso;

    import java.util.ArrayList;

    public class NieuwsAdapter extends RecyclerView.Adapter<NieuwsAdapter.NieuwsViewHolder> {

        private Context NieuwsContext;
        private ArrayList<NieuwsItem> NieuwsList;
        private OnItemClickListener NieuwsListener;

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

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

        public NieuwsAdapter(Context context, ArrayList<NieuwsItem> nieuwslist) {
            NieuwsContext = context;
            NieuwsList = nieuwslist;
        }

        @NonNull
        @Override
        public NieuwsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(NieuwsContext).inflate(R.layout.nieuws_item, parent, false);
            return new NieuwsViewHolder(v);
        }

        @Override
        public void onBindViewHolder(NieuwsViewHolder holder, int position) {
            NieuwsItem currentitem = NieuwsList.get(position);

            String ImageUrl = currentitem.getImageUrl();
            String Heading = currentitem.getHeading();
            String Excerpt = currentitem.getExcerpt();

            holder.NieuwsTextViewHeading.setText(Heading);
            holder.NieuwsTextViewExcerpt.setText(Excerpt);
            Picasso.get().load(ImageUrl).fit().centerInside().into(holder.NieuwsImageView);
        }

        @Override
        public int getItemCount() {

            return NieuwsList.size();
        }

        public class NieuwsViewHolder extends RecyclerView.ViewHolder {

            public ImageView NieuwsImageView;
            public TextView NieuwsTextViewHeading;
            public TextView NieuwsTextViewExcerpt;

            public NieuwsViewHolder(@NonNull View itemView) {
                super(itemView);

                NieuwsImageView = itemView.findViewById(R.id.nieuws_image);
                NieuwsTextViewHeading = itemView.findViewById(R.id.nieuws_heading);
                NieuwsTextViewExcerpt = itemView.findViewById(R.id.nieuws_excerpt);

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (NieuwsListener != null) {
                            int position = getAdapterPosition();
                            if (position != RecyclerView.NO_POSITION) {
                                NieuwsListener.onItemClick(position);
                            }
                        }
                    }
                });
            }
        }
    }

DetailActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

public class DetailActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        Intent intent = getIntent();
        String imageUrl = intent.getStringExtra("EXTRA_URL");
        String creatorName = intent.getStringExtra("EXTRA_HEADING");
        String likeCount = intent.getStringExtra("EXTRA_CONTENT");

        ImageView imageView = findViewById(R.id.nieuws_detail_image);
        TextView textViewHeading = findViewById(R.id.nieuws_detail_heading);
        TextView textViewContent = findViewById(R.id.nieuws_detail_content);

        Picasso.get().load(imageUrl).fit().centerInside().into(imageView);
        textViewHeading.setText(creatorName);
        textViewContent.setText("Likes: " + likeCount);
    }
}

【问题讨论】:

    标签: java android android-studio android-fragments android-recyclerview


    【解决方案1】:

    你不能使用NieuwsAdapter.setOnItemClickListener(getActivity());,除非你的活动实现了OnItemClickListener接口,但是我看到你的片段实现了OnItemClickListener,所以你可以像这样使用片段:

    fNieuwsAdapter.setOnItemClickListener(NieuwsFragment.this);
    

    顺便说一句,您正在通过意图发送数据:

    detailIntent.putExtra(EXTRA_URL, clickedItem.getImageUrl());
    detailIntent.putExtra(EXTRA_HEADING, clickedItem.getHeading());
    detailIntent.putExtra(EXTRA_CONTENT, clickedItem.getContent());
    

    您必须使用相同的参数来获取它们(删除“”):

     String imageUrl = intent.getStringExtra(EXTRA_URL);
     String creatorName = intent.getStringExtra(EXTRA_HEADING);
     String likeCount = intent.getStringExtra(EXTRA_CONTENT);
    

    希望对你有帮助

    【讨论】:

    • 谢谢!这行得通!但是,现在它没有通过 putExtra。你有什么线索吗?
    • 没有错误:O,它只是白色屏幕,但如果我这样做:setText("test".creatorName);有用。只有“测试ofc..所以数据没有被发送。
    • 检查你通过intent发送的数据是否不为空
    • 刚刚检查了日志并在 onItemClick 内部记录了 clickedItem.getImage 和 getHeading 等。等等。它的登录很好。它显示在日志中
    • 您确实对“”正确。但是..没有“”,我得到一个红色错误,我通过使用修复它:NieuwsFragment.EXTRA_URL
    【解决方案2】:

    改变

    public NieuwsAdapter(Context context, ArrayList<NieuwsItem> nieuwslist) {
            NieuwsContext = context;
            NieuwsList = nieuwslist;
        }
    

    public NieuwsAdapter(Context context, ArrayList<NieuwsItem> nieuwslist, OnItemClickListener mOnClickListener) {
            this.NieuwsContext = context;
            this.NieuwsList = nieuwslist;
            this.NieuwsListener = mOnClickListener;
        }
    

    还有这个

    itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (NieuwsListener != null) {
                            int position = getAdapterPosition();
                            if (position != RecyclerView.NO_POSITION) {
                                NieuwsListener.onItemClick(position);
                            }
                        }
                    }
                });
    

    改成

    itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                       NieuwsListener.onItemClick(int position); 
                    }
                });
    

    然后在片段中你可以这样操作

    fNieuwsAdapter = new NieuwsAdapter(getActivity(), fNieuwsList,new NieuwsAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position)
            {
                //DoSomethingHere
            }
      });
    

    【讨论】:

    • 感谢您的回复,@B.M 已经为我解决了。唯一不工作的是数据传递给 DetailActivity
    • 你 detailIntent.putExtra(EXTRA_URL, clickedItem.getImageUrl());其中EXTRA_URL =“nieuwsImageUrl”;然后你的intent.getStringExtra("EXTRA_URL");而不是 intent.getStringExtra("nieuwsImageUrl");
    • 嗯,我已经这样做了,看看上面。感谢您的帮助,如果您有任何其他提示,我很高兴听到!
    猜你喜欢
    • 2021-05-23
    • 2021-06-18
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多