2

BaseExpandableListAdapter に関連付けられた ExpendableListView があります。このリストでは、ユーザーが子をクリックすると、いくつかのメソッドがトリガーされ、checkBox がオンに設定されます (ユーザーがもう一度クリックしても、chackBox はオフになります)。

onChildClick メソッドを適切に使用できるようにするために、android:enabled="false"多数の投稿で示唆されているように、checkBox を に設定しました。

問題は、チェックボックスが自動的に灰色になり、チェックされているかどうかにかかわらずです。アクティビティの動作には影響しませんが、あまり視覚的ではありません (チェックが薄緑色の場合とは異なります)。

色付きのチェックボックスを使用して、まったく同じ動作を維持するにはどうすればよいですか?

android:enabled="false"または、言い換えれば、ビューの色を使用して保持することは可能ですか (そして簡単ですか) ?

checkBox の xml コードは次のとおりです。

<CheckBox android:id="@+id/config_can_spn_checkbox"
android:layout_marginRight="30dip"
android:layout_weight="1"
android:layout_width="0dip"
android:layout_height="match_parent"
android:enabled="false"
android:focusable="false" />

BaseExpandableListAdapter クラス:

public class ConfigCanAdapter extends BaseExpandableListAdapter {

private Context context;
private List<Pgn> pgnList;
private LayoutInflater inflater;

public ConfigCanAdapter(Context context, List<Pgn> pgnList) {
    this.context = context;
    this.pgnList = pgnList;
    inflater = LayoutInflater.from(context);
}

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

public Spn getChild(int gPosition, int cPosition) {
    return pgnList.get(gPosition).getSpnList().get(cPosition);
}

public long getChildId(int gPosition, int cPosition) {
    return cPosition;
}

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

    final Spn spn = (Spn) getChild(groupPosition, childPosition);

    ChildViewHolder childViewHolder;

    if (convertView == null) {
        childViewHolder = new ChildViewHolder();

        convertView = inflater.inflate(R.layout.group_child, null);

        childViewHolder.textViewChildSpnName = (TextView) convertView.findViewById(R.id.config_can_spn_name_text);
        childViewHolder.textViewChildSpnUnit = (TextView) convertView.findViewById(R.id.config_can_spn_unit_text);
        childViewHolder.checkBoxChildSpn = (CheckBox) convertView.findViewById(R.id.config_can_spn_checkbox); 

        convertView.setTag(childViewHolder);
    } else {
        childViewHolder = (ChildViewHolder) convertView.getTag();
    }

    childViewHolder.textViewChildSpnName.setText(spn.getName());

    childViewHolder.textViewChildSpnUnit.setText("(" + spn.getUnit() + ")");        

    return convertView;
}

public int getChildrenCount(int gPosition) {
    return pgnList.get(gPosition).getSpnList().size();
}

public Object getGroup(int gPosition) {
    return pgnList.get(gPosition);
}


public int getGroupCount() {
    return pgnList.size();
}

public long getGroupId(int gPosition) {
    return gPosition;
}

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    GroupViewHolder gholder;
    Pgn pgn = (Pgn) getGroup(groupPosition);

    if (convertView == null) {
        gholder = new GroupViewHolder();

        convertView = inflater.inflate(R.layout.group_row, null);

        gholder.textViewGroup = (TextView) convertView.findViewById(R.id.TVGroup);

        convertView.setTag(gholder);
    } else {
        gholder = (GroupViewHolder) convertView.getTag();
    }

    gholder.textViewGroup.setText(pgn.getId());

    return convertView;
}

public boolean hasStableIds() {
    return true;
}

public boolean isChildSelectable(int arg0, int arg1) {
    return true;
}

class GroupViewHolder {
    public TextView textViewGroup;
}

class ChildViewHolder {
    public TextView textViewChildSpnName;
    public TextView textViewChildSpnUnit;
    public CheckBox checkBoxChildSpn;
}

}

そして最後に onChildClickListener :

expandableList.setOnChildClickListener(new OnChildClickListener() {

    @Override
    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
        // TODO Auto-generated method stub
        CheckBox cb = (CheckBox)v.findViewById(R.id.config_can_spn_checkbox);
        cb.toggle();
        Toast.makeText(getBaseContext(), "Group = " + String.valueOf(groupPosition) + " child = " + String.valueOf(childPosition), Toast.LENGTH_SHORT).show();
        return false;
    }
});
4

3 に答える 3

1

設定するだけandroid:clickable="false"android:focusable="false"、すべてのクリックが取り除かれ、フォーカスが移ることはありませんが、希望どおりのenabled外観を維持できます

于 2013-06-18T15:22:48.430 に答える
0

ボタンのセレクターを次のようにオーバーライドできます。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_enabled="false" android:drawable="@drawable/image_enabled" />
   <item android:drawable="@drawable/image_enabled" />
</selector>

このコードだけがあなたに合っているかどうかはわかりませんが、それはアイデアです:)ここここでチュートリアルを確認してください。

于 2013-06-18T15:18:10.790 に答える
0

チェックボックスを無効にする代わりに、クリックリスナーを使用してクリックをインターセプトし、値を元に戻すことができます。ちょっとしたハックのように聞こえます。または、ビューをサブクラス化し、その方法で望ましくない動作をオーバーライドすることもできます。

于 2013-06-18T15:18:34.573 に答える