【问题标题】:Custom ArrayAdapter. isEnabled does not update last item自定义 ArrayAdapter。 isEnabled 不更新最后一项
【发布时间】:2017-11-02 17:01:07
【问题描述】:

我有ListView,当标志变为假时禁用部分项目。让我们说除第一个之外的所有内容。为了使项目明显禁用,我在适配器的isEnabled(position) 中调用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>

我在活动的onCreate() 中初始化ListView

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    _listView = findViewById(R.id.list);
    _cbChecked = findViewById(R.id.checkbox_checked);

    _isAllTestEnabled = true;

    final String[] itemsStrings =
            { "0. Item",
                "1. Item",
                "2. Item",
                "3. Item",
                "4. Item",
                "5. Item",
                "6. Item",
                "7. Item",
                "8. Item",
                "9. Item",
                "10. Item" };


    final ArrayAdapter<String> adapter = new BITAdapter(this, R.layout.list_item, R.id.listText, itemsStrings);
    _listView.setAdapter(adapter);

    _cbChecked.setChecked(true);
    _cbChecked.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            _isAllTestEnabled = isChecked;
            _listView.invalidate();
        }
    });
}

我写了自定义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;
        }
    }
}

【问题讨论】:

  • 为什么要使列表视图“_listView.invalidate()”无效? , 而不是通知适配器。
  • 如何通知它?
  • 您可以使用“_listView.notifyDataSetChanged();”进行通知
  • 不幸的是,这不起作用。当我在 adapter.notifyDataSetChanged() 上更改 _listView.invalidate() 时,没有任何变化 - 当我调用它时,android 不会询问是否启用了最后一个可见项目

标签: android listview android-arrayadapter


【解决方案1】:

我在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());
            }
        }
    });

OnScrollListener:

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    bitAdapter.isEnabled(bitListView.getLastVisiblePosition());
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2018-05-29
    相关资源
    最近更新 更多