Android 处理recyclerview和x27的点击;内部项目

Android 处理recyclerview和x27的点击;内部项目,android,onclicklistener,android-recyclerview,ontouchlistener,Android,Onclicklistener,Android Recyclerview,Ontouchlistener,我有一个recyclerview,通过一个评论按钮显示类似facebook的新闻源。我不知道当用户点击评论按钮时如何显示对话框。我在这里找到的所有解决方案都是处理整个项目的单击,而不是其内部视图。我也试过这个溶液 这是我的适配器类 public class NewsfeedAdapter extends RecyclerView.Adapter<NewsfeedAdapter.NewsfeedViewHolder> { private final LayoutInflater in

我有一个recyclerview,通过一个评论按钮显示类似facebook的新闻源。我不知道当用户点击评论按钮时如何显示对话框。我在这里找到的所有解决方案都是处理整个项目的单击,而不是其内部视图。我也试过这个溶液

这是我的适配器类

public class NewsfeedAdapter extends RecyclerView.Adapter<NewsfeedAdapter.NewsfeedViewHolder> {

private final LayoutInflater inflater;
private Context context;

ArrayList<NewsfeedItem> data=  new ArrayList<NewsfeedItem>();

public NewsfeedAdapter(Context context,ArrayList<NewsfeedItem> data){
    inflater= LayoutInflater.from(context);
    this.data=data;
    this.context = context;
}
@Override
public NewsfeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.custom_newsfeed_row, parent, false);
    NewsfeedViewHolder holder = new NewsfeedViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(NewsfeedViewHolder newsfeedViewHolder, int i) {
    NewsfeedItem current = data.get(i);
    newsfeedViewHolder.username.setText(current.username);
    newsfeedViewHolder.icon.setImageResource(current.iconid);
    newsfeedViewHolder.timestamp.setText((CharSequence) current.timestamp);
    newsfeedViewHolder.news.setText(current.news);
}


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


class NewsfeedViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView news, username, timestamp, comment_btn, like_btn;
    ImageView icon;
    private NewsfeedClickInterface clickListener;

    public NewsfeedViewHolder(View itemView) {
        super(itemView);
        news = (TextView) itemView.findViewById(R.id.news);
        timestamp = (TextView) itemView.findViewById(R.id.timestamp);
        username = (TextView) itemView.findViewById(R.id.username);
        icon = (ImageView) itemView.findViewById(R.id.profile_img);
        comment_btn = (TextView) itemView.findViewById(R.id.comment_btn);
        comment_btn.setTag("comment");
        comment_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (clickListener != null) {
            clickListener.onItemClicked(getPosition(), v.getTag().toString());
        }
    }
}
public interface NewsfeedClickInterface {
    public void onItemClicked(int position, String tag);
}
公共类NewsfeedAdapter扩展了RecyclerView.Adapter{
私人充气机;
私人语境;
ArrayList数据=新的ArrayList();
公共NewsfeedAdapter(上下文、ArrayList数据){
充气器=充气器。从(上下文);
这个。数据=数据;
this.context=上下文;
}
@凌驾
public NewsfeedViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=充气机。充气(R.layout.custom\u newsfeed\u行,父级,false);
NewsfeedViewHolder=新的NewsfeedViewHolder(视图);
报税表持有人;
}
@凌驾
BindViewHolder上的公共无效(NewsfeedViewHolder NewsfeedViewHolder,int i){
NewsfeedItem当前=data.get(i);
newsfeedViewHolder.username.setText(current.username);
newsfeedViewHolder.icon.setImageResource(current.iconid);
newsfeedViewHolder.timestamp.setText((CharSequence)current.timestamp);
newsfeedViewHolder.news.setText(current.news);
}
@凌驾
public int getItemCount()
{
返回data.size();
}
类NewsfeedViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
text查看新闻、用户名、时间戳、评论等;
图像视图图标;
私有新闻FeedClickInterface clickListener;
公共NewsfeedViewHolder(查看项目视图){
超级(项目视图);
news=(TextView)itemView.findViewById(R.id.news);
timestamp=(TextView)itemView.findViewById(R.id.timestamp);
username=(TextView)itemView.findViewById(R.id.username);
icon=(ImageView)itemView.findViewById(R.id.profile\u img);
comment_btn=(TextView)itemView.findViewById(R.id.comment_btn);
注释(见“注释”);
注释\u btn.setOnClickListener(此);
}
@凌驾
公共void onClick(视图v){
如果(clickListener!=null){
单击Listener.onItemClicked(getPosition(),v.getTag().toString());
}
}
}
公共界面NewsfeedClickInterface{
单击公共空格(int位置,字符串标记);
}

}

您可以检查视图的Id,并根据单击的视图启动不同的单击侦听器。 像

希望这能有所帮助。

 @Override
public void onClick(View v) {
    if(view.getId() == comment_btn.getId()){
        Log.d("LOGTAG","Bingo !!! Your view Clicked.");
    }
    if (clickListener != null) {
        clickListener.onItemClicked(getPosition(), v.getTag().toString());
    }
}

首先在viewholder中定义一个界面。当点击按钮时,调用此界面

 public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    public interface ViewHolderClickListener {
        public void onItemClick(View caller, int position);
    }

    public ViewHolderClickListener mListener;

    public ViewHolder(View itemView, ViewHolderClickListener listener) {
        super(itemView);
        mListener = listener;
        //other initializations...
    }

    @Override
    public void onClick(View v) {
        mListener.onItemClick(v, getPosition());
    }
}
然后在一个单独的文件中创建另一个接口,假设您在一个名为Commons的类中创建此接口:

public class Commons {

    public interface OnRecyclerItemClickedListener{
        public void onRecyclerItemClicked(String parameter);
    }

}
然后让您的片段/活动实现该接口。并将此接口作为参数传递给适配器的构造函数

public class MyFragment extends Fragment implements Commons.OnRecyclerItemClickedListener{

    @Override
    public void onRecyclerItemClicked(String productId) {
        //do whatever you want on click
    }
}
将此接口传递给适配器的构造函数:

//here "this" parameter is your listener since your fragment implements
//the interface you defined
MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(items, R.layout.yourlayout, getContext(), this);
在适配器中,创建在Commons类中定义的接口的实例,并在构造函数中设置它。然后在onCreateViewHolder方法中创建您的viewholder。最后,在Viewholder的click界面中调用您在Commons类中定义的接口:

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

    private OnRecyclerItemClickedListener onRecyclerItemClickedListener;

    public MyRecyclerViewAdapter(List<Item> items, int rowLayout, Context context, OnRecyclerItemClickedListener onRecyclerItemClickedListener){
        this.items = items;
        this.rowLayout = rowLayout;
        this.mContext = context;
        this.onRecyclerItemClickedListener = onRecyclerItemClickedListener;
    }



    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false);
        ViewHolder holder = new ViewHolder(v, new ViewHolder.ViewHolderClickListener() {

        @Override
        public void onItemClick(View caller, int position) {
            onRecyclerItemClickedListener.onRecyclerItemClicked(put_parameters_if_you_want);
        }});
        return holder;
    }

}
公共类MyRecycleServiceAdapter扩展了RecycleView.Adapter{
私有OnRecyclerItemClickedListener OnRecyclerItemClickedListener;
公共MyRecycleServiceAdapter(列表项、整数行布局、上下文上下文、onRecycleItemClickedListener onRecycleItemClickedListener){
这个项目=项目;
this.rowLayout=rowLayout;
this.mContext=上下文;
this.onRecyclerItemClickedListener=onRecyclerItemClickedListener;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(rowLayout,parent,false);
ViewHolder=newviewholder(v,newviewholder.ViewHolderClickListener(){
@凌驾
公共控件单击(视图调用者,int位置){
onRecyclerItemClickedListener.onRecyclerItemClicked(如果需要,请输入参数);
}});
报税表持有人;
}
}
这有点复杂,但下面是对您所做操作的解释:单击按钮时,您的按钮单击侦听器调用另一个侦听器(在viewholder中定义),该侦听器调用在片段中实现的另一个侦听器


这就是你所需要做的。

我也试过了。但它只返回整个项的id,而不是在视图持有者中实现View.OnClickListener。为单个项目创建单击式侦听器,然后重试。
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder>{

    private OnRecyclerItemClickedListener onRecyclerItemClickedListener;

    public MyRecyclerViewAdapter(List<Item> items, int rowLayout, Context context, OnRecyclerItemClickedListener onRecyclerItemClickedListener){
        this.items = items;
        this.rowLayout = rowLayout;
        this.mContext = context;
        this.onRecyclerItemClickedListener = onRecyclerItemClickedListener;
    }



    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(rowLayout, parent, false);
        ViewHolder holder = new ViewHolder(v, new ViewHolder.ViewHolderClickListener() {

        @Override
        public void onItemClick(View caller, int position) {
            onRecyclerItemClickedListener.onRecyclerItemClicked(put_parameters_if_you_want);
        }});
        return holder;
    }

}