Javascript 解析JSON数据后向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

我有一个片段,其中包含一个RecyclerView。我解析了一个网页上的JSON数据,并使用教程将其显示在这个RecyclerView中:

现在我想在RecyclerView项目中添加一个onClick。我知道如何对静态RecyclerView项执行此操作,但不知道在这种情况下如何设置onClickListener。对于静态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);
        }
    }
}
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。我应该做些不同的事吗?谢谢!它就像一个符咒。正是我想要的:)