Android 为什么禁用的项在listview中仍然可检查

Android 为什么禁用的项在listview中仍然可检查,android,listview,Android,Listview,我想要一个包含一些项目的列表视图,所有项目都可以检查。但是如果第一个项目没有被选中,那么另一个项目就没有被启用,当然,它们当时不应该被选中。 因此,我将ListView扩展到MyListView,如下所示: public class MyListView extends ListView { public MyListView(Context context) { super(context); Init(); } public MyListView(Context cont

我想要一个包含一些项目的列表视图,所有项目都可以检查。但是如果第一个项目没有被选中,那么另一个项目就没有被启用,当然,它们当时不应该被选中。 因此,我将ListView扩展到MyListView,如下所示:

public class MyListView extends ListView {

public MyListView(Context context) {
    super(context);
    Init();
}

public MyListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    Init();
}

public MyListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    Init();
}

private void Init() {
    setAdapter(new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_multiple_choice,array ));
    setChoiceMode(CHOICE_MODE_MULTIPLE);

    setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            SparseBooleanArray posArray = getCheckedItemPositions();
            boolean bChecked = false;
            if( null != posArray ) {
                for( int i = 0; i < posArray.size(); i++ ) {
                    int nIdx = posArray.keyAt(i);
                    if( nIdx == 0 ) {
                        bChecked = posArray.get(nIdx);
                        break;
                    }
                }
            }

            if( position == 0 ) {
                bChecked = !bChecked;

                for( int i = 1; i < array.length; i++ ) {
                    getChildAt(i).setEnabled(!bChecked);
                }
            } 
        }
    });
}

private String[] array = { "Test1", "Test2", "Test3", "Test4" }; 

您需要调用
setClickable(boolean)
以使其不可单击,而不是
setEnabled(boolean)

您应该实现适配器的getview(),谢谢您的回答,我会试试。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/parentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

</RelativeLayout>
ListView listView = new ListView(this);
String [] datas = new String[36]; // generate you data here 
final boolean [] status = new boolean[36]; // generate you check status here 

final MyAdapter adapter = new MyAdapter(datas, status); 
listView.setAdapter(adapter );

listView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        if( position== 0 || status[0] ) {
            status[position] = !status[positioin];
            adapter.notifyDataSetChanged();
        }
    }
});
RelativeLayout parentLayout = (RelativeLayout)findViewById(R.id.parentLayout);
parentLayout.addView(listView);
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeightSmall"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
/>
private class MyAdapter extends BaseAdapter{
public MyAdapter( final String [] datas, final boolean [] status ) {
    this.datas = datas;
    this.status = status;
    inflater = LayoutInflater.from(MainActivity.this);
}

@Override
public int getCount() {
    return datas.length;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if( null == convertView ) {
        convertView = inflater.inflate(R.layout.listview_checkedtextview, null);
        convertView = convertView.findViewById(R.id.text1);
    } 

    CheckedTextView checkedTextView = (CheckedTextView) convertView;
    checkedTextView.setText(datas[position]);
    checkedTextView.setChecked(status[position]);
    checkedTextView.setEnabled( position == 0 ? true : status[0]);

    return convertView;
}

private String [] datas;
private boolean [] status;
private LayoutInflater inflater;
}