简体   繁体   English

如何将不同的 OnClickListener 分配给 recyclerview 中的不同项目?

[英]How can I assign a different OnClickListener to different items in a recyclerview?

I'm doing my final project that due tomorrow and I only have one thing left to do.我正在做明天到期的期末项目,我只剩下一件事要做。 But I already lost a lot of time on it.但是我已经在上面浪费了很多时间。 I am creating a recyclerview from a JSON that I obtain through Volley from the Adafruit API and everything is fine, the only thing i need is that when I clicking on the items different Intents are opened.我正在从 JSON 创建一个 recyclerview,我通过 Volley 从 Adafruit API 获得,一切都很好,我唯一需要的是当我点击项目时打开不同的意图。 I would greatly appreciate if someone could help me.如果有人能帮助我,我将不胜感激。 I have to say that I am working on a fragment and there things are a little different.我不得不说我正在研究一个片段,但有些不同。

The code of my Adapter:我的适配器代码:

public class AdafruitFeedAdapter extends RecyclerView.Adapter<AdafruitFeedAdapter.viewholder> {
    ArrayList<FeedData> feedData;
    public AdafruitFeedAdapter(ArrayList<FeedData> feedData) {
        this.feedData = feedData;
    }

    @NonNull
    @Override
    public viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feed, parent, false);

        return new viewholder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull viewholder holder, int position) {
        holder.setData(feedData.get(position));
    }

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

    public class viewholder extends RecyclerView.ViewHolder implements View.OnClickListener {
        Button btnMisFeeds;
        FeedData dataHolder;

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

            btnMisFeeds = itemView.findViewById(R.id.btnMisFeeds);
            btnMisFeeds.setOnClickListener(this);
        }

        public void setData(FeedData feedData) {
            dataHolder = feedData;
            btnMisFeeds.setText(dataHolder.getName());
        }

        @Override
        public void onClick(View v) {

        }
    }

The code of my fragment:我的片段的代码:

public class FragmentInicio extends Fragment {
    Button btnControlar, btnAddFeed;
    View view;
    String temperatura, distancia, infrarrojo, polvo;

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    private static final String USER_PREFERENCES = "userPreferences";
    private static final String TOKEN_KEY = "token";

    private RequestQueue nQueue;
    ArrayList<AdafruitFeed> adF;
    AdafruitFeedAdapter adapterFeed;
    RecyclerView recyclerView;
    SharedPreferences userPreferences;
    SharedPreferences.Editor userEditor;
    String token;

    public FragmentInicio() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment FragmentInicio.
     */
    // TODO: Rename and change types and number of parameters
    public static FragmentInicio newInstance(String param1, String param2) {
        FragmentInicio fragment = new FragmentInicio();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment_inicio, container, false);
        btnControlar = view.findViewById(R.id.btnControlar);
        btnAddFeed = view.findViewById(R.id.btnAddFeed);
        btnControlar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(v.getContext(), ControlActivity.class));
            }
        });

        btnAddFeed.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(v.getContext(), AgregarFeedActivity.class));
            }
        });

        nQueue = SingletonRequest.getInstance(view.getContext()).getRequestQueue();
        adF = new ArrayList<>();
        userPreferences = view.getContext().getSharedPreferences(USER_PREFERENCES, Context.MODE_PRIVATE);
        userEditor = userPreferences.edit();
        token = userPreferences.getString(TOKEN_KEY, null);

        getFeeds();
        return view;
    }

    public void getFeeds() {
        String url = "https://cleanbotapi.live/api/v1/feeds";

        final JsonObjectRequest getFeeds = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                recyclerView = (RecyclerView) view.findViewById(R.id.recyclerFeed);
                recyclerView.setHasFixedSize(true);
                LinearLayoutManager linearManager = new LinearLayoutManager(view.getContext());
                recyclerView.setLayoutManager(linearManager);

                final Gson gson = new Gson();
                final AdafruitFeed adafruitFeed = gson.fromJson(response.toString(), AdafruitFeed.class);
                adapterFeed = new AdafruitFeedAdapter(adafruitFeed.getListFeedData());
                temperatura = adafruitFeed.getListFeedData().get(0).getName();
                distancia = adafruitFeed.getListFeedData().get(1).getName();
                infrarrojo = adafruitFeed.getListFeedData().get(2).getName();
                polvo = adafruitFeed.getListFeedData().get(3).getName();
                recyclerView.setAdapter(adapterFeed);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("errorPeticion", error.toString());
            }
        }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Authorization", "Bearer " + token);
                return headers;
            }
        };

        nQueue.add(getFeeds);
    }
}

I trying to create an OnClickListener for everyone of my Adafruit feeds but i cant.我试图为我的每个 Adafruit 提要创建一个 OnClickListener,但我做不到。

First of all the naming convention of a class should be in "PascalCase".首先,class 的命名约定应采用“PascalCase”。

You need to define an interface that contains a method for your listener and pass it to the constructor of the adapter.您需要定义一个包含侦听器方法的接口,并将其传递给适配器的构造函数。 And then also pass this listener to your ViewHolder by constructor.然后还通过构造函数将此侦听器传递给您的ViewHolder

Example:例子:

public class AdafruitFeedAdapter extends RecyclerView.Adapter<AdafruitFeedAdapter.viewholder> {
    public interface OnClickListener {
        void onClick(FeedData data, int position);
    }

    ArrayList<FeedData> feedData;
    OnClickListener clickListener;

    public AdafruitFeedAdapter(ArrayList<FeedData> feedData,OnClickListener clickListener) {
        this.feedData = feedData;
        this.clickListener = clickListener;
    }

    ...

    @NonNull
    @Override
    public viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_feed, parent, false);

        return new viewholder(v,clickListener);
    }

}

And in your viewholder modify it like below:并在您的viewholder中修改它,如下所示:

...
OnClickListener clickListener;

public viewholder(@NonNull View itemView,OnClickListener clickListener) {
    super(itemView);
    this.clickListener = clickListener;
    btnMisFeeds = itemView.findViewById(R.id.btnMisFeeds);
    btnMisFeeds.setOnClickListener(this);
}

...

@Override
public void onClick(View v) {
    clickListener.onClick(dataHolder,getBindingAdapterPosition());
}

...

And your fragment:还有你的片段:

public class FragmentInicio extends Fragment implements AdafruitFeedAdapter.OnClickListener {

    ...
    
    @override
    public void onClick(FeedData data, int position){
        // TODO: implement your intent action
    }
    
    ...

}

And your adapter: adapterFeed = new AdafruitFeedAdapter(adafruitFeed.getListFeedData(),FragmentInicio.this);还有你的适配器: adapterFeed = new AdafruitFeedAdapter(adafruitFeed.getListFeedData(),FragmentInicio.this);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在AsyncTask中的RecyclerView项上设置OnClickListener - How to set OnClickListener on RecyclerView items inside AsyncTask 如何在recyclerview中的项目之间有不同的间距 - How to have different spacing between items in the recyclerview 如何仅在status_id = 1时才能在Recyclerview中设置onClickListener,否则就没有onClickListener - How can i set onClickListener in Recyclerview only if status_id = 1 else no onClickListener 如何为JComboBox中的项目分配不同的颜色? - How to assign different colors to items in JComboBox? 如何向按钮 recyclerview 添加不同的 id - How can I add different ids to buttons recyclerview 如何从不同的活动向 RecyclerView 添加开关布局? - How can I add a switch layout to a RecyclerView from a different activity? 如何在RecyclerView上设置onClickListener? - How to set onClickListener on RecyclerView? Android onclicklistener在不同的布局,我一直失败 - Android onclicklistener at different layouts, i keep failing 如何在Java Web应用程序的不同类中分配不同的计划时间 - How can I assign different Scheduling time in different classes of java web application 如何将不同的菜单项添加到多个上下文菜单? - How can I add different menu items to multiple context menus?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM