gpt4 book ai didi

javascript - RecyclerView解析JSON数据后添加onClick

转载 作者:行者123 更新时间:2023-11-30 00:46:07 24 4
gpt4 key购买 nike

我有一个 fragment ,其中有一个 RecyclerView。我从网页解析了 JSON 数据,并使用教程将其显示在这个 RecyclerView 中:https://www.learn2crack.com/2016/02/recyclerview-json-parsing.html

现在我想为 RecyclerView 项目添加一个 onClick。我知道如何对静态 RecyclerView 项目执行此操作,但在这种情况下不知道如何设置 setOnClickListener。对于静态 recyclerview 项目,我将此类用于 onClick 事件。

package com.parassidhu.cdlumaths;

import android.support.v7.widget.RecyclerView;
import android.view.View;

public class ItemClickSupport {
private final RecyclerView mRecyclerView;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
private View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
}
};
private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mOnItemLongClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
return false;
}
};
private RecyclerView.OnChildAttachStateChangeListener mAttachListener
= new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
if (mOnItemClickListener != null) {
view.setOnClickListener(mOnClickListener);
}
if (mOnItemLongClickListener != null) {
view.setOnLongClickListener(mOnLongClickListener);
}
}

@Override
public void onChildViewDetachedFromWindow(View view) {

}
};

private ItemClickSupport(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mRecyclerView.setTag(R.id.item_click_support, this);
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
}

public static ItemClickSupport addTo(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
if (support == null) {
support = new ItemClickSupport(view);
}
return support;
}

public static ItemClickSupport removeFrom(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
if (support != null) {
support.detach(view);
}
return support;
}

public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
return this;
}

public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
mOnItemLongClickListener = listener;
return this;
}

private void detach(RecyclerView view) {
view.removeOnChildAttachStateChangeListener(mAttachListener);
view.setTag(R.id.item_click_support, null);
}

public interface OnItemClickListener {

void onItemClicked(RecyclerView recyclerView, int position, View v);
}

public interface OnItemLongClickListener {

boolean onItemLongClicked(RecyclerView recyclerView, int position, View v);
}
}

我的适配器类是:

package com.parassidhu.cdlumaths;

import android.content.ClipData;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.parassidhu.cdlumaths.R;
import com.parassidhu.cdlumaths.Android;

import java.util.ArrayList;

public class NoticesData extends RecyclerView.Adapter<NoticesData.ViewHolder> {

private ArrayList<Android> mAndroidList;
private RecyclerView recyclerView;
public NoticesData(ArrayList<Android> androidList, RecyclerView rcl) {
mAndroidList = androidList;
recyclerView=rcl;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.notices_row, parent, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.mTvName.setText(mAndroidList.get(position).getName());
ItemClickSupport.addTo(recyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
//I can't call Toast or startIntent here
}
});
}

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

public class ViewHolder extends RecyclerView.ViewHolder{

private TextView mTvName;
public ViewHolder(View view) {
super(view);
mTvName = (TextView)view.findViewById(R.id.tv_name);
}
}
}

最佳答案

在您的 Activity 或 Fragment 类中创建如下所示的方法

public void showToast(int position) {
Toast.makeText(getActivity(), "Clicked position is " + position, Toast.LENGTH_SHORT).show();
}

(我认为您使用的是 Fragment,所以我使用了 getActivity())

现在像这样更新您的 Adapter 构造函数

...
...
private YourFragment frag;

public NoticesData(ArrayList<Android> androidList, RecyclerView rcl, YourFragment fragment) {
mAndroidList = androidList;
recyclerView = rcl;
frag = fragment;
}

在你的 Fragment 中像这样更新 Adapter 初始化

NoticesData notice = NoticesData(androidList, rcl, YourFragment.this);

现在在 Adapter 中调用 showToast() 方法

ItemClickSupport.addTo(recyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {

frag.showToast(position); // it's like callback method

}
});

注意:这里的 YourFragment 表示托管 RecyclerView 的 Fragment。

关于javascript - RecyclerView解析JSON数据后添加onClick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41782179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com