【问题标题】:Android ListView's OnItemClickListener did not catch inner item's click eventAndroid ListView OnItemClickListener 没有捕捉到内部项目点击事件
【发布时间】:2021-07-05 01:51:44
【问题描述】:

在我的列表视图中,有很多组件。我想点击的一个组件是名为 kickOutBtn 的 ImageButton。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/drawer_pane"
    android:paddingVertical="6dp"
    android:descendantFocusability="blocksDescendants"
    android:paddingHorizontal="28dp">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/profile_image"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_centerVertical="true"
        android:background="@color/colorGray"/>

    <TextView
        android:id="@+id/profile_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:text="nickname"
        android:layout_centerVertical="true"
        android:layout_marginLeft="8dp"
        android:layout_toRightOf="@id/profile_image"
        android:textColor="@color/colorBlack"
        android:textSize="10dp"/>

    <RelativeLayout
        android:id="@+id/fake_click_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="false"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true">

    <TextView
        android:id="@+id/owner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:text="manager"
        android:layout_centerInParent="true"
        android:textColor="@color/colorBlack"
        android:textSize="10dp"/>

    <ImageButton
        android:id="@+id/kickOutBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="4dp"
        android:visibility="invisible"
        android:scaleType="fitCenter"
        android:background="@color/colorTransparent"
        android:tint="@color/colorBlack"
        android:src="@drawable/ic_baseline_close_24"/>
    </RelativeLayout>


</RelativeLayout>

它们在视图中的相同位置。

我的意思是,Textview 位于 ImageButton 的中心。

如果 ListView 项的目标是经理,我想让其列表项的 ImageButton 不可见并打开显示经理的 Textview,如果不是,我想让其列表项的 ImageButton 显示相反,我想使所有者 Textview 不可见。 (默认是imagebutton不可见,textview可见)

为此,我尝试了这段代码。

// ListAdapter中的getView

@Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {
        View view;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.navi_list_menu_item, null);
        } else {
            view = convertView;
        }

        ImageButton kick_btn = (ImageButton) view.findViewById(R.id.kickOutBtn);
        TextView supervisor_tv = (TextView) view.findViewById(R.id.owner);

        if (roomSupervisor.equals(mNavItems.get(i).fb_uid)) {
            kick_btn.setVisibility(View.INVISIBLE);
        } else {
            supervisor_tv.setVisibility(View.INVISIBLE);
            if (roomSupervisor.equals(SessionInfo.fb_uid)) {
                kick_btn.setVisibility(View.VISIBLE);
            } else {
                kick_btn.setVisibility(View.INVISIBLE);
            }
        }

        return view;
    }

// Activity中的OnItemClickListener

private AdapterView.OnItemClickListener onItemClickListener = (adapterView, view, i, l) -> {
        if(view.getId() == R.id.kickOutBtn) {
            Log.d(TAG, "kick");
            popupDialog(i);
        } else {
            Log.d(TAG, i + "is pushed");
        }
    };

在这种情况下,kick ImageButton 是不可点击的……(列表行的点击事件执行良好)

每当我单击该按钮时,Activity 中的 onItemClickListener 都没有响应...

我该怎么办...?

【问题讨论】:

  • 你能发布适配器的完整代码吗?
  • 尝试将supervisor_tv.setVisibility(View.INVISIBLE);更改为supervisor_tv.setVisibility(View.GONE);

标签: android listview


【解决方案1】:

所以您的活动实现了 OnItemClickListener。然后,您还需要将点击侦听器设置为您的活动。你做到了吗?

mListView.setOnItemClickListener(activity)

【讨论】:

  • 我也是这样做的。 mDrawerList.setOnItemClickListener(onItemClickListener);
  • mDrawerList 是一个 ListView!
  • 哦,我刚刚将 OnItemClickListener 初始化为变量@Leo Lamas
【解决方案2】:

你可以像这样在你的适配器中设置监听器:

if (roomSupervisor.equals(mNavItems.get(i).fb_uid)) {
        kick_btn.setVisibility(View.INVISIBLE);
    } else {
        supervisor_tv.setVisibility(View.INVISIBLE);
        if (roomSupervisor.equals(SessionInfo.fb_uid)) {
            kick_btn.setVisibility(View.VISIBLE);
        } else {
            kick_btn.setVisibility(View.INVISIBLE);
        }
    }
 kick_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // do what you want here
        }
    });

【讨论】:

    【解决方案3】:

    由于建议使用RecyclerView 而不是ListView,所以我使用RecyclerView 来解决您的问题。 我创建了一个数据类,将在RecyclerView 的项目视图中使用。

    数据类

     class Item {
        String nickName;
        boolean isManager;
        Item(String nickName, boolean isManager){
            this.nickName = nickName;
            this.isManager = isManager;
        }
      }
    

    回收站视图适配器

        static class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder>{
        List<Item> items;
    
        RecyclerAdapter(List<Item> itemList){
            items = itemList;
        }
    
        @NonNull
        @Override
        public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
            return new RecyclerViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
            if (items.get(position).isManager){
                holder.owner.setVisibility(View.VISIBLE);
                holder.kickBtn.setVisibility(View.INVISIBLE);
            }else {
                holder.owner.setVisibility(View.INVISIBLE);
                holder.kickBtn.setVisibility(View.VISIBLE);
            }
            holder.bind(items.get(position));
        }
    
        @Override
        public int getItemCount() {
            return items.size();
        }
    
        class RecyclerViewHolder extends RecyclerView.ViewHolder{
            TextView owner;
            ImageButton kickBtn;
            TextView profileView;
            RecyclerViewHolder(View view){
                super(view);
                profileView = view.findViewById(R.id.profile_name);
                owner = view.findViewById(R.id.owner);
                kickBtn = view.findViewById(R.id.kickOutBtn);
                owner.setOnClickListener(v -> {
                    items.get(getAdapterPosition()).isManager = false;
                    notifyItemChanged(getAdapterPosition());
                });
                kickBtn.setOnClickListener(v ->{
                    items.get(getAdapterPosition()).isManager = true;
                    notifyItemChanged(getAdapterPosition());
                });
            }
            void bind(Item item){
                profileView.setText(item.nickName);
            }
        }
    }
    

    Recycler View 的 xml

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:id="@+id/list_view"
            tools:listitem="@layout/list_item"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    最后,将适配器设置为 Recycler View,如下所示:

       RecyclerView recyclerView = root.findViewById(R.id.list_view);
     // Just creating sample list for testing . You could customize your data class as per your requirement.
        List<Item> items = new ArrayList<>();
        items.add(new Item("Choco",true));
        items.add(new Item("Nrusingha",false));
        items.add(new Item("Barbie",true));
        items.add(new Item("Uttam",false));
        items.add(new Item("Smruti",false));
        items.add(new Item("Choco",true));
        items.add(new Item("Nrusingha",true));
        items.add(new Item("Barbie",true));
        items.add(new Item("Uttam",false));
        items.add(new Item("Smruti",true));
        RecyclerAdapter recyclerAdapter = new RecyclerAdapter(items);
    
    
        recyclerView.setAdapter(recyclerAdapter);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-28
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多