解决ListView的OnItemClickListener无效问题

该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:

  • beforeDescendants:viewgroup会优先其子类控件而获取到焦点
  • afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
  • blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

通常我们用到的是blocksDescendants,在Item的根布局设置
android:descendantFocusability="blocksDescendants"

  • item_list_view.xml
<?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="match_parent"
------------------------------------------------------------------------------
    android:descendantFocusability="blocksDescendants"
------------------------------------------------------------------------------
>
    <ImageView
        android:id="@+id/image_library"
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:background="@drawable/color_white_yellow"/>
    <TextView
        android:id="@+id/text_library"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="大众书局"
        android:textSize="18sp"
        android:textStyle="bold"
        android:layout_marginTop="10dp"
        android:textColor="@color/white"/>
    <TextView
        android:id="@+id/text_location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/text_library"
        android:text="东城汇 | 仙林"
        android:layout_centerHorizontal="true"
        android:textSize="15sp"
        android:textColor="@color/white"/>

    <ImageButton
        android:id="@+id/btn_star"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_margin="10dp"/>

</RelativeLayout>

ok,设置好了之后,子view的可以设置OnClick(),Item也可以setOnItemClickListener()了,又可以愉快的玩耍了。

转载于:https://my.oschina.net/JiangTun/blog/917942

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ListViewsetEmptyView方法是用来设置列表为空时显示的View,但是有时候我们在使用该方法时发现并有生效,可能是以下几个原因: 1. 有给ListView设置Adapter,因为只有当Adapter有数据时才会显示EmptyView。 2. 在设置EmptyView之前已经给ListView设置了数据源,需要在设置EmptyView之前将数据源清空。 3. 在设置EmptyView之前需要先inflate出EmptyView的布局,并将其添加到ListView的父布局中。 以下是一个setEmptyView无效的例: ```java ListView listView = findViewById(R.id.list_view); View emptyView = findViewById(R.id.empty_view); listView.setEmptyView(emptyView); String[] data = {"item1", "item2", "item3"}; ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data); listView.setAdapter(adapter); ``` 上述代码中,设置了EmptyView,但是并有生效,因为在设置EmptyView之前已经给ListView设置了数据源,需要将数据源清空,即在setAdapter之前添加如下代码: ```java listView.setAdapter(null); ``` 另外,还需要注意,EmptyView需要先inflate出来并添加到ListView的父布局中,例如: ```java View emptyView = LayoutInflater.from(this).inflate(R.layout.empty_view, (ViewGroup) listView.getParent(), false); ``` 至于ListView的源码实现,可以参考以下几个方法: 1. setEmptyView方法: ```java public void setEmptyView(View emptyView) { mEmptyView = emptyView; final T adapter = mAdapter; final boolean empty = ((adapter == null) || adapter.isEmpty()); updateEmptyStatus(empty); } private void updateEmptyStatus(boolean empty) { if (isInFilterMode()) { empty = false; } if (empty) { if (mEmptyView != null) { mEmptyView.setVisibility(View.VISIBLE); setVisibility(View.GONE); } else { // If the caller just removed our empty view, make sure the list view is visible setVisibility(View.VISIBLE); } // We are now GONE, so pending layouts will not be dispatched. // Force one here to ensure that the state of the list matches // the state of the adapter. if (mDataChanged) { this.onLayout(false, getLeft(), getTop(), getRight(), getBottom()); } } else { if (mEmptyView != null) { mEmptyView.setVisibility(View.GONE); } setVisibility(View.VISIBLE); } } ``` 2. setAdapter方法: ```java public void setAdapter(ListAdapter adapter) { if (mAdapter != null) { mAdapter.unregisterDataSetObserver(mDataSetObserver); resetList(); } mAdapter = adapter; if (mAdapter != null) { mOldSelectedPosition = INVALID_POSITION; mOldSelectedRowId = INVALID_ROW_ID; mItemCount = mAdapter.getCount(); mDataChanged = true; // Detect the case where a cursor that was previously invalidated has // been repopulated with new data. mHasStableIds = mAdapter.hasStableIds(); if (mChoiceMode != CHOICE_MODE_NONE && mAdapter.hasStableIds()) { mChoiceMode = CHOICE_MODE_SINGLE; if (mCheckStates == null) { mCheckStates = new SparseBooleanArray(); } if (mCheckedIdStates == null) { mCheckedIdStates = new LongSparseArray<Boolean>(); } } if (!mPopupHidden) { // Show the popup if we have one if (mAdapter.getCount() > 0) { showPopup(); } } } else { mItemCount = 0; mDataChanged = false; mHasStableIds = false; mOldSelectedPosition = INVALID_POSITION; mOldSelectedRowId = INVALID_ROW_ID; mChoiceMode = CHOICE_MODE_NONE; mCheckStates.clear(); mCheckedIdStates.clear(); // Hide the currently visible popup dismissPopup(); } if (mFilter != null) { mAdapter.getFilter().filter(mFilter); } requestLayout(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值