Android 定制阵列适配器。isEnabled不更新最后一项

Android 定制阵列适配器。isEnabled不更新最后一项,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,我有ListView,当标志变为false时,禁用部分项目。让我们说所有的,除了第一个。要使项目被明显禁用,我在适配器的isEnabled(位置)中调用setAlpha()。除了最后一个项目的isEnabled(position)未被调用(如果它部分显示)之外,这一切正常。只有当我禁用项目时才会发生这种情况。如何强制ListView为所有可见项调用它 有趣的是,最后一项被禁用,这意味着单击它不会导致onClick事件。但它并没有被重新绘制:( 我创建项目布局: <RelativeLayou

我有
ListView
,当标志变为false时,禁用部分项目。让我们说所有的,除了第一个。要使项目被明显禁用,我在适配器的isEnabled(位置)中调用
setAlpha()
。除了最后一个项目的
isEnabled(position)
未被调用(如果它部分显示)之外,这一切正常。只有当我禁用项目时才会发生这种情况。如何强制
ListView
为所有可见项调用它

有趣的是,最后一项被禁用,这意味着单击它不会导致
onClick
事件。但它并没有被重新绘制:(

我创建项目布局:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/listText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:textSize="0.12in"
        android:paddingStart="10dp"
        android:paddingEnd="20dp"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"/>

   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:textSize="0.18in"
       android:layout_alignParentEnd="true"
       android:text=">"/>
</RelativeLayout>
我编写了自定义
ArrayAdapter

private class BITAdapter extends ArrayAdapter<String> {

    public BITAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull String[] objects) {
        super(context, resource, textViewResourceId, objects);
    }

    @Override
    public boolean areAllItemsEnabled() {
        return true;
    }

    @Override
    public boolean isEnabled(int position) {
        View child  = _listView.getChildAt(position - _listView.getFirstVisiblePosition());
        if (child == null) {
            return _isAllTestEnabled;
        }
        if (position == 0) {
            child.setEnabled(true);
            child.setAlpha(1.0f);
            return true;
        } else {
            child.setEnabled(_isAllTestEnabled);
            child.setAlpha(_isAllTestEnabled ? 1.0f : 0.3f);
            return _isAllTestEnabled;
        }
    }
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    bitAdapter.isEnabled(bitListView.getLastVisiblePosition());
}
私有类BITAdapter扩展了ArrayAdapter{
公共比特适配器(@NonNull上下文上下文、int资源、int textViewResourceId、@NonNull字符串[]对象){
超级(上下文、资源、textViewResourceId、对象);
}
@凌驾
公共布尔值areAllItemsEnabled(){
返回true;
}
@凌驾
公共布尔值isEnabled(整型位置){
View child=_listView.getChildAt(位置-_listView.getFirstVisiblePosition());
if(child==null){
返回-不可测试;
}
如果(位置==0){
child.setEnabled(true);
儿童setAlpha(1.0f);
返回true;
}否则{
setEnabled(_isAllTestEnabled);
child.setAlpha(_可测试?1.0f:0.3f);
返回-不可测试;
}
}
}

我解决了在
OnItemClickListener
中调用
isEnabled(\u listView.getLastVisiblePosition())
并在适配器中保存启用状态的问题:

 bitListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(position == 0) {
                bitAdapter.setEnabledState(!((CheckedTextView) view).isChecked());
                bitAdapter.isEnabled(bitListView.getLastVisiblePosition());
            }
        }
    });

这允许解析缺少的
isEnabled()
调用。希望有人能节省时间:)

我解决了在
OnItemClickListener中调用
isEnabled(_listView.getLastVisiblePosition())
并在适配器中保存启用状态的问题:

 bitListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(position == 0) {
                bitAdapter.setEnabledState(!((CheckedTextView) view).isChecked());
                bitAdapter.isEnabled(bitListView.getLastVisiblePosition());
            }
        }
    });

这允许解析缺少的
isEnabled()
调用。希望有人能节省时间:)

为什么要使listview无效“\u listview.invalidate()”,相反,您只需通知适配器。我如何通知它?您可以通过使用“_listView.notifyDataSetChanged();”进行通知,不幸的是,这不起作用。当我在
适配器上更改
\u listView.invalidate()
时,没有任何更改-当我调用它时,android不询问是否启用了最后一个可见项为什么使listView无效“\u listView.invalidate()”,相反,您只需通知适配器。我如何通知它?您可以通过使用“_listView.notifyDataSetChanged();”进行通知,不幸的是,这不起作用。当我在
适配器上更改
\u listView.invalidate()
时,notifyDataSetChanged()
没有任何更改-当我调用它时,android不询问是否启用了最后一个可见项