我有ListView
,当标志变为false时,禁用部分项目。让我们说除了第一个之外的所有。要明确禁用项目,请拨打setAlpha()
适配器中的isEnabled(position)
。这种方法很有效,但如果部分显示最后一个项目,则不会调用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>
我在活动ListView
中初始化onCreate()
:
@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;
}
}
}
答案 0 :(得分:0)
我在isEnabled(_listView.getLastVisiblePosition())
中调用OnItemClickListener
并在适配器中保存启用状态解决了这个问题:
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()
调用的问题。希望有人能节省时间:)。