Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将单击侦听器添加到回收器视图的子级?_Java_Android_Android Recyclerview_Onitemclicklistener - Fatal编程技术网

Java 如何将单击侦听器添加到回收器视图的子级?

Java 如何将单击侦听器添加到回收器视图的子级?,java,android,android-recyclerview,onitemclicklistener,Java,Android,Android Recyclerview,Onitemclicklistener,下面是我的讨论.java,其中包含RecyclerView public class Discussion extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); super.onCreate(savedInst

下面是我的
讨论.java
,其中包含
RecyclerView

public class Discussion extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_discussion);
        RecyclerView mRecycleview =(RecyclerView)findViewById(R.id.cycleview);
        mRecycleview.setLayoutManager(new LinearLayoutManager(this));
        String[] use ={"a","b"};
        String[] lo={"be","ndls"};
        String[] ti={"12:00","11:00"};
        String[] staus={"Today","Tommmorow"};
        int[] posimg={R.drawable.img_post1,R.drawable.img_post2};

        mRecycleview.setAdapter(new FeedAdapter(use,lo,ti,staus,posimg));
        @NonNull
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Open Activity for posting", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        // Functionality for poll
    }
}
这是我的
FeedAdapter
,用于从资源布局文件
content.xml
获取的
RecyclerView

public class FeedAdapter extends 
    RecyclerView.Adapter<FeedAdapter.FeedViewHolder> {

    private  String[] userdata;
    private  String[] locdata;
    private  String[] timedata;
    private  int[]   postdata;
    private  String[] statusdata;

    public  FeedAdapter(String[] userdata,String[] locdata,String[] timedata,String[] statusdata,int[] postdata){
        this.userdata=userdata;
        this.locdata=locdata;
        this.postdata=postdata;
        this.statusdata=statusdata;
        this.timedata=timedata;
    }

    @Override
    public FeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(parent.getContext());
        View view =inflater.inflate(R.layout.backupofcontent,parent,false);
        return new FeedViewHolder(view);
    }

    @Override
    public void onBindViewHolder( FeedAdapter.FeedViewHolder holder, int position) {
        String user=userdata[position];
        String loc=locdata[position];
        String time=timedata[position];
        String status=statusdata[position];
        int post=postdata[position];
        holder.username.setText(user);
        holder.locationa.setText(loc);
        holder.timea.setText(time);
        holder.statusa.setText(status);
        if(post==0)
            holder.postimg.setVisibility(View.GONE);
        else
            holder.postimg.setImageResource(post);
    }

    @Override
    public int getItemCount() {
        return userdata.length;
    }

    public class FeedViewHolder extends RecyclerView.ViewHolder{

        ImageView postimg;
        TextView username;
        TextView locationa;
        TextView timea;
        TextView statusa;

        public FeedViewHolder(View itemView) {
            super(itemView);
            postimg=itemView.findViewById(R.id.imgView_postPic);
            username=itemView.findViewById(R.id.user_name);
            locationa=itemView.findViewById(R.id.Location);
            timea=itemView.findViewById(R.id.Time);
            statusa=itemView.findViewById(R.id.post_text);
        }
    }
}

与其他视图相同,在
FeedViewHolder
类中添加
LinearLayout
变量:

LinearLayout-like

然后

like=itemView.findviewbyd(R.id.likelayout)

然后在
onBindViewHolder
中使用:

holder.like.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                // Like Layout was clicked
            }
        });

onBindViewHolder
函数中,只需添加如下所示的单击侦听器

@Override
public void onBindViewHolder( FeedAdapter.FeedViewHolder holder, int position) {
    String user=userdata[position];
    String loc=locdata[position];
    String time=timedata[position];
    String status=statusdata[position];
    int post=postdata[position];
    holder.username.setText(user);
    holder.locationa.setText(loc);
    holder.timea.setText(time);
    holder.statusa.setText(status);

    if(post==0)
        holder.postimg.setVisibility(View.GONE);
    else
        holder.postimg.setImageResource(post);

    holder.username.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            // Do something. 
        }
    });
}
<ImageView
    android:id="@+id/like_image"
    android:layout_width="25dp"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:src="@drawable/like"/>
public class FeedAdapter extends 
    RecyclerView.Adapter<FeedAdapter.FeedViewHolder> {

    private  String[] userdata;
    private  String[] locdata;
    private  String[] timedata;
    private  int[]   postdata;
    private  String[] statusdata;

    // Add another extra variable to store context
    // The context is necessary for showing toast
    private Context context; 

    public  FeedAdapter(String[] userdata, String[] locdata,String[] timedata, String[] statusdata, int[] postdata, Context context){
        this.userdata = userdata;
        this.locdata = locdata;
        this.postdata = postdata;
        this.statusdata = statusdata;
        this.timedata = timedata;
        this.context = context; // Initialize it here
    }

    @Override
    public FeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(parent.getContext());
        View view =inflater.inflate(R.layout.backupofcontent,parent,false);
        return new FeedViewHolder(view);
    }

    @Override
    public void onBindViewHolder( FeedAdapter.FeedViewHolder holder, int position) {
        String user=userdata[position];
        String loc=locdata[position];
        String time=timedata[position];
        String status=statusdata[position];
        int post=postdata[position];
        holder.username.setText(user);
        holder.locationa.setText(loc);
        holder.timea.setText(time);
        holder.statusa.setText(status);

        if(post==0)
            holder.postimg.setVisibility(View.GONE);
        else
            holder.postimg.setImageResource(post);

        // Use the context here to show the Toast 
        holder.username.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context, "Something", Toast.LENGTH_LOGN).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return userdata.length;
    }

    public class FeedViewHolder extends RecyclerView.ViewHolder{

        ImageView postimg;
        TextView username;
        TextView locationa;
        TextView timea;
        TextView statusa;

        public FeedViewHolder(View itemView) {
            super(itemView);
            postimg=itemView.findViewById(R.id.imgView_postPic);
            username=itemView.findViewById(R.id.user_name);
            locationa=itemView.findViewById(R.id.Location);
            timea=itemView.findViewById(R.id.Time);
            statusa=itemView.findViewById(R.id.post_text);
        }
    }
}
如果要将单击侦听器设置为列表项中的其他UI元素,则只需像声明
用户名
时间a
状态a
等那样声明它们,然后将侦听器添加到列表项中

请记住,为了使
ImageView
可点击,您需要在布局文件中将
clickable
属性添加到
true
。例如,如果需要使类似图像可单击,则需要添加如下所示的
clickable
属性

@Override
public void onBindViewHolder( FeedAdapter.FeedViewHolder holder, int position) {
    String user=userdata[position];
    String loc=locdata[position];
    String time=timedata[position];
    String status=statusdata[position];
    int post=postdata[position];
    holder.username.setText(user);
    holder.locationa.setText(loc);
    holder.timea.setText(time);
    holder.statusa.setText(status);

    if(post==0)
        holder.postimg.setVisibility(View.GONE);
    else
        holder.postimg.setImageResource(post);

    holder.username.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            // Do something. 
        }
    });
}
<ImageView
    android:id="@+id/like_image"
    android:layout_width="25dp"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:src="@drawable/like"/>
public class FeedAdapter extends 
    RecyclerView.Adapter<FeedAdapter.FeedViewHolder> {

    private  String[] userdata;
    private  String[] locdata;
    private  String[] timedata;
    private  int[]   postdata;
    private  String[] statusdata;

    // Add another extra variable to store context
    // The context is necessary for showing toast
    private Context context; 

    public  FeedAdapter(String[] userdata, String[] locdata,String[] timedata, String[] statusdata, int[] postdata, Context context){
        this.userdata = userdata;
        this.locdata = locdata;
        this.postdata = postdata;
        this.statusdata = statusdata;
        this.timedata = timedata;
        this.context = context; // Initialize it here
    }

    @Override
    public FeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(parent.getContext());
        View view =inflater.inflate(R.layout.backupofcontent,parent,false);
        return new FeedViewHolder(view);
    }

    @Override
    public void onBindViewHolder( FeedAdapter.FeedViewHolder holder, int position) {
        String user=userdata[position];
        String loc=locdata[position];
        String time=timedata[position];
        String status=statusdata[position];
        int post=postdata[position];
        holder.username.setText(user);
        holder.locationa.setText(loc);
        holder.timea.setText(time);
        holder.statusa.setText(status);

        if(post==0)
            holder.postimg.setVisibility(View.GONE);
        else
            holder.postimg.setImageResource(post);

        // Use the context here to show the Toast 
        holder.username.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context, "Something", Toast.LENGTH_LOGN).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return userdata.length;
    }

    public class FeedViewHolder extends RecyclerView.ViewHolder{

        ImageView postimg;
        TextView username;
        TextView locationa;
        TextView timea;
        TextView statusa;

        public FeedViewHolder(View itemView) {
            super(itemView);
            postimg=itemView.findViewById(R.id.imgView_postPic);
            username=itemView.findViewById(R.id.user_name);
            locationa=itemView.findViewById(R.id.Location);
            timea=itemView.findViewById(R.id.Time);
            statusa=itemView.findViewById(R.id.post_text);
        }
    }
}
要采用修改后的构造函数的更改,需要按照
讨论
类中的如下步骤初始化适配器

mRecycleview.setAdapter(new FeedAdapter(use, lo, ti, staus, posimg, this));

希望有帮助

只需在RecyclerView的onBindViewHolder中将一个侦听器添加到当前的ViewHolder中。欢迎使用StackOverflow。我只是补充了一个答案。请检查并让我知道这是否有帮助!我需要为FeedViewHolder中的其他UI元素声明吗?意思是像直线一样。好的,成功了。谢谢你的帮助!但要使其正常工作,需要将LInearlayout的所有子项设置为clickable=“false”,而线性布局仅为true。很高兴知道这一点。如果有帮助,请接受答案。:)