Android RecyclerView OnClickListener 没有反应

Posted

技术标签:

【中文标题】Android RecyclerView OnClickListener 没有反应【英文标题】:Android RecyclerView OnClickListener not reacting 【发布时间】:2015-09-04 12:59:00 【问题描述】:

好的,所以我在我的项目中使用 RecyclerView 并且需要为每个列表项实现点击监听器并在每个项目中实现一个图标。

我尝试的是这个解决方案:https://***.com/a/24933117/722462 因为它对我来说看起来很不错。但我无法让点击监听器对任何点击事件做出反应。任何想法我的实施有什么问题?下面列出的所有文件。

fragment_search.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    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_
        android:layout_/>

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

        <ImageView
            android:layout_
            android:layout_
            android:id="@+id/icon_search_empty"
            android:background="@drawable/ic_info_outline_black_48dp" />

        <TextView
            android:layout_
            android:layout_
            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_
    android:clickable="true"
    android:layout_>

    <ImageView
        android:id="@+id/icon_item_station_fav"
        android:layout_
        android:layout_
        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_
        android:layout_
        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();
    


【问题讨论】:

您缺少图像视图的侦听器。但是,即使您点击文本视图,它也不会触发吗? 事实上我错过了 TextView 的监听器,事实证明它覆盖了所有父视图并且在 ImageView 之上,因此它正在拦截所有事件。所以问题解决了;) 【参考方案1】:

尝试改变:

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

itemView.setOnClickListener(new View.OnClickListener 
    @Override
    public void onClick(View v) 
    // appropriate code in here
    
);

对 favIcon 执行相同的操作。我感觉您的问题是由于您的 OnClickListener 位于 ViewHolder 上,而不是实际上位于 TextView 和 ImageView 上。

【讨论】:

以上是关于Android RecyclerView OnClickListener 没有反应的主要内容,如果未能解决你的问题,请参考以下文章

Android RecyclerView嵌套RecyclerView

Android之RecyclerView介绍

Android:RecyclerView里面的RecyclerView,滚动到底部

Android教程2020 - RecyclerView获取滑动距离

android recyclerview怎么设置每次只能滑动一页

Android的import android.support.v7.widget.RecyclerView的RecyclerView标红问题