Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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 Android RecyclerView OnClickListener没有反应_Java_Android_Onclicklistener_Android Recyclerview_Android Viewholder - Fatal编程技术网

Java Android RecyclerView OnClickListener没有反应

Java Android RecyclerView OnClickListener没有反应,java,android,onclicklistener,android-recyclerview,android-viewholder,Java,Android,Onclicklistener,Android Recyclerview,Android Viewholder,好的,所以我在我的项目中使用RecyclerView,需要为每个列表项实现click listener,并在每个项中实现一个图标 我尝试的是这个解决方案:因为它对我来说很好。但我无法让click listener对任何单击事件做出反应。你知道我的实现有什么问题吗?下面列出的所有文件 fragment_search.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x

好的,所以我在我的项目中使用RecyclerView,需要为每个列表项实现click listener,并在每个项中实现一个图标

我尝试的是这个解决方案:因为它对我来说很好。但我无法让click listener对任何单击事件做出反应。你知道我的实现有什么问题吗?下面列出的所有文件

fragment_search.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivityFragment">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/search_recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <LinearLayout
        android:id="@+id/search_empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical|center_horizontal"
        android:orientation="vertical"
        android:visibility="gone">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/icon_search_empty"
            android:background="@drawable/ic_info_outline_black_48dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Brak wyników wyszukiwania"
            android:id="@+id/text_search_empty" />
    </LinearLayout>

</RelativeLayout>

清单项目:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_station_layout"
    android:layout_width="match_parent"
    android:clickable="true"
    android:layout_height="48dp">

    <ImageView
        android:id="@+id/icon_item_station_fav"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:background="@drawable/ic_favorite_border_blue_24dp"
        android:clickable="true"
        android:paddingLeft="16dp"
        android:tint="#E3F2FD"/>

    <TextView
        android:id="@+id/item_station_name"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:paddingLeft="58dp"
        android:gravity="start|center_vertical"
        android:clickable="true"
        android:ellipsize="end"
        android:maxLines="1"
        android:singleLine="true"
        android:textSize="16sp" />

</RelativeLayout>

最后是SearchAdapter.java:

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

    private List<StationDTO> stations;

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

        public TextView stationName;
        public ImageView favIcon;

        private IHasSearchViewHolderCallback hasSearchViewHolderCallback;

        public ViewHolder(View itemView, IHasSearchViewHolderCallback hasSearchViewHolderCallback) {
            super(itemView);

            this.hasSearchViewHolderCallback = hasSearchViewHolderCallback;

            favIcon = (ImageView) itemView.findViewById(R.id.icon_item_station_fav);
            stationName = (TextView) itemView.findViewById(R.id.item_station_name);

            itemView.setOnClickListener(this);
            favIcon.setOnClickListener(this);

            Context ctx = itemView.getContext().getApplicationContext();
            FontHelper.ROBOTO_REGULAR.on(ctx, stationName);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.item_station_layout:
                    hasSearchViewHolderCallback.onItemLayout(getAdapterPosition());
                    break;
                case R.id.icon_item_station_fav:
                    hasSearchViewHolderCallback.onFavIcon(getAdapterPosition());
                    break;
                case R.id.item_station_name:
                    hasSearchViewHolderCallback.onStationName(getAdapterPosition());
                    break;
            }
        }

        public interface IHasSearchViewHolderCallback {
            void onItemLayout(int position);
            void onFavIcon(int position);
            void onStationName(int position);
        }
    }

    public SearchAdapter(List<StationDTO> stations) {
        this.stations = stations;
    }

    @Override
    public SearchAdapter.ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {

        View item = LayoutInflater
                .from(parent.getContext())
                .inflate(R.layout.item_station, parent, false);

        ViewHolder vh = new ViewHolder(item, new ViewHolder.IHasSearchViewHolderCallback() {
            @Override
            public void onItemLayout(int position) {
                Toast.makeText(parent.getContext(), "LAYOUT #" + position, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFavIcon(int position) {
                Toast.makeText(parent.getContext(), "FAV #" + position, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onStationName(int position) {
                Toast.makeText(parent.getContext(), "NAME #" + position, Toast.LENGTH_SHORT).show();
            }
        });

        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        StationDTO dto = stations.get(position);

        holder.stationName.setText(dto.getName());
    }

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

}
公共类SearchAdapter扩展了RecyclerView.Adapter{
私人名单站;
公共静态类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
公共文本视图站名;
公众形象观;
私有IHasSearchViewHolderCallback已搜索ViewHolderCallback;
公共视图持有者(视图项视图,IHasSearchViewHolderCallback HasearchViewHolderCallback){
超级(项目视图);
this.hasearchviewholdercallback=hasearchviewholdercallback;
favIcon=(ImageView)itemView.findViewById(R.id.icon\u item\u station\u fav);
stationName=(TextView)itemView.findViewById(R.id.item\u station\u name);
setOnClickListener(这个);
favIcon.setOnClickListener(这个);
Context ctx=itemView.getContext().getApplicationContext();
FontHelper.ROBOTO_REGULAR.on(ctx,stationName);
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.项目\车站\布局:
HasearchViewHolderCallback.onItemLayout(getAdapterPosition());
打破
案例R.id.图标\项目\车站\ fav:
onFavIcon(getAdapterPosition());
打破
案例R.id.项目\站点\名称:
onStationName(getAdapterPosition());
打破
}
}
公共界面iHasserViewHolderCallback{
无效布局(内部位置);
无效onFavIcon(内部位置);
无效onStationName(内部位置);
}
}
公共搜索适配器(列出站点){
这个.站=站;
}
@凌驾
public SearchAdapter.ViewHolder onCreateViewHolder(最终视图组父级,int-viewType){
视图项=布局调整器
.from(parent.getContext())
.充气(R.布局图.项目_站,父项,假);
ViewHolder vh=新的ViewHolder(项目,new ViewHolder.IHasSearchViewHolderCallback(){
@凌驾
公共空间布局(内部位置){
Toast.makeText(parent.getContext(),“LAYOUT#”+position,Toast.LENGTH\u SHORT.show();
}
@凌驾
奥法维康公共空间(内部位置){
Toast.makeText(parent.getContext(),“FAV#”+位置,Toast.LENGTH_SHORT.show();
}
@凌驾
公共无效onStationName(内部位置){
Toast.makeText(parent.getContext(),“NAME#”+position,Toast.LENGTH\u SHORT.show();
}
});
返回vh;
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
StationTo dto=stations.get(位置);
holder.stationName.setText(dto.getName());
}
@凌驾
public int getItemCount(){
返回站。大小();
}
}
尝试更改:

@Override
public void onClick(View v) {
            switch (v.getId()) {
                case R.id.item_station_layout:
                    hasSearchViewHolderCallback.onItemLayout(getAdapterPosition());
                    break;
                case R.id.icon_item_station_fav:
                    hasSearchViewHolderCallback.onFavIcon(getAdapterPosition());
                    break;
                case R.id.item_station_name:
                    hasSearchViewHolderCallback.onStationName(getAdapterPosition());
                    break;
            }
        }


对法维康也一样。我感觉您的问题是由于您的OnClickListener位于ViewHolder上,而不是TextView和ImageView上。

您缺少图像视图的侦听器。但是,即使你点击文本视图,它也不会启动吗?事实上,我缺少文本视图的侦听器,它覆盖了所有的父视图,超过了ImageView,所以它拦截了所有事件。所以问题解决了;)
itemView.setOnClickListener(new View.OnClickListener {
    @Override
    public void onClick(View v) {
    // appropriate code in here
    }
});