1

我有一个recyclerview显示Facebook像新闻源与评论按钮。我无法弄清楚当用户点击评论按钮时如何显示对话框。我在这里找到的所有解决方案都是处理整个项目的点击,而不是其内部视图。我也尝试过这种精神。 How to handle multiple layout clicks in recyclerView in Android处理点击回收视图的内部项目

这是我的适配器类。

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); 
} 

}

回答

1

首先定义你的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()); 
    } 
} 

然后,在一个单独的文件创建另一个界面,让我们说你在一个名为共享类来创建这个接口:

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); 

,并在适配器中,创建在共享类中定义的接口的实例并设置它在你的构造。然后在onCreateViewHolder方法中创建您的视图。最后,叫你在你的共享类的Viewholder的点击界面中定义的接口:

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; 
    } 

} 

这是一个有点复杂,但这里是你做什么的解释:当按钮被点击,你按一下按钮监听电话另一个侦听器(在您的视图中定义),并且该侦听器调用在您的片段中实现的另一个侦听器。

这就是你需要做的。

0

,您可以检查的意见ID和火根据被点击,其针对不同听众的点击。 like

comment_btn.setOnClickListener(this); 
anotherButton.setOnClickListener(this); 

switch (v.getId()) 

case R.id.comment_btn: 
     code goes here 

case R.id.another_button: 

希望对您有所帮助。

+0

我也试过。但它只返回整个项目的ID。 –

+0

而不是在视图持有者中实现View.OnClickListener。为单个项目创建点击监听器,然后尝试。 –

0

@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()); 
    } 
} 
相关问题