Javascript 解析JSON数据后向RecyclerView添加onClick
我有一个片段,其中包含一个RecyclerView。我解析了一个网页上的JSON数据,并使用教程将其显示在这个RecyclerView中: 现在我想在RecyclerView项目中添加一个onClick。我知道如何对静态RecyclerView项执行此操作,但不知道在这种情况下如何设置onClickListener。对于静态recyclerview项,我将此类用于onClick事件Javascript 解析JSON数据后向RecyclerView添加onClick,javascript,android,json,Javascript,Android,Json,我有一个片段,其中包含一个RecyclerView。我解析了一个网页上的JSON数据,并使用教程将其显示在这个RecyclerView中: 现在我想在RecyclerView项目中添加一个onClick。我知道如何对静态RecyclerView项执行此操作,但不知道在这种情况下如何设置onClickListener。对于静态recyclerview项,我将此类用于onClick事件 package com.parassidhu.cdlumaths; import android.support
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);
}
}
}
package com.parassidhu.cdlumath;
导入android.content.ClipData;
导入android.content.Intent;
导入android.net.Uri;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.parassidhu.cdlumaths.R;
导入com.parassidhu.cdlumaths.Android;
导入java.util.ArrayList;
公共类NoticesData扩展了RecyclerView.Adapter{
私人庭审法官;
私人回收站;
公共公告数据(ArrayList androidList,RecyclerView rcl){
mAndroidList=男性主义者;
recyclerView=rcl;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.notices\u行,parent,false);
返回新的ViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(最终ViewHolder,内部位置){
holder.mTvName.setText(mAndroidList.get(position.getName());
ItemClickSupport.addTo(recyclerView.setOnItemClickListener)(新的ItemClickSupport.OnItemClickListener(){
@凌驾
单击公共空视图(RecyclerView RecyclerView,内部位置,视图v){
//我不能在这里叫Toast或Startinent
}
});
}
@凌驾
public int getItemCount(){
返回mAndroidList.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
私有文本视图mTvName;
公共视图持有者(视图){
超级(视图);
mTvName=(TextView)view.findViewById(R.id.tv_name);
}
}
}
必须从该回收器视图的适配器中为回收器视图中的每个项目设置click listener。当您在recycler视图中为每个项(视图)设置数据时,您也可以为该视图添加onClickListener。在活动或片段类中创建如下方法
public void showToast(int position) {
Toast.makeText(getActivity(), "Clicked position is " + position, Toast.LENGTH_SHORT).show();
}
(我想您使用的是Fragment,所以我使用了getActivity()
)
现在像这样更新适配器构造函数
...
...
private YourFragment frag;
public NoticesData(ArrayList<Android> androidList, RecyclerView rcl, YourFragment fragment) {
mAndroidList = androidList;
recyclerView = rcl;
frag = fragment;
}
NoticesData notice = NoticesData(androidList, rcl, YourFragment.this);
现在在适配器中调用下面的showtoos()
方法
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的片段。适配器类的代码在哪里?将在几分钟后发布hrs@Superman我已经添加了它。我可以从adapter类添加onClickListener,但我不能在adapter类中执行某些操作,例如,我不能启动Tintent或显示Toast。我应该做些不同的事吗?谢谢!它就像一个符咒。正是我想要的:)