1

いくつかのアイテムを含むlistViewが必要で、それらすべてをチェックできます。ただし、最初のアイテムがチェックされていない場合、他のアイテムは有効になっていません。もちろん、その時点でチェック可能であってはなりません。したがって、次のように 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" }; 

}

そして、問題が発生しました。無効になっているアイテムはまだチェック可能です。何か問題がありますか? どうすればいいですか?ありがとう。


実際、この問題は pawan yadav の提案によって解決されました。ベローは私のコードです。誰かが同じ問題に遭遇するのを助けたいです。

activity_main.xml:

<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>

アクティビティの onCreate メソッドで:

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);

listview_checkedtextview.xml:

<?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;
}
4

1 に答える 1