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