1

リストビューのレイアウトがあり、その下に水平に2つのボタンがあるlinearlayoutがあります。チェックボックスがチェックされていないときに2つのボタンを非表示にしたいのですが、コードで2つのボタンが非表示になり、代わりに黒が表示されます。チェックボをオンにすると、2 つのボタンが表示されないのはなぜですか?

class RestaurantAdapter extends BaseAdapter {
    private ArrayList<Boolean> status = new ArrayList<Boolean>();
    private static LayoutInflater inflater = null;
    private ArrayList<HashMap<String, String>> data;
    Activity activity;
    LinearLayout layout;
public RestaurantAdapter(Activity activity,
        ArrayList<HashMap<String, String>> data, LinearLayout layout) {
    this.layout = layout;
    this.activity = activity;
    this.data = data;
    inflater = (LayoutInflater) activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    for (int i = 0; i < data.size(); i++) {
        status.add(false);
    }
}
public int getCount() {
    return data.size();
}
public Object getItem(int position) {
    return position;
}
public long getItemId(int position) {
    return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if (vi == null)
        vi = inflater.inflate(R.layout.restaurant_multi_select_list_item,
                null);
    TextView name = (TextView) vi
            .findViewById(R.id.restaurant_multi_select_title);
    ImageView image = (ImageView) vi
            .findViewById(R.id.restaurant_multi_select_list_item_image);
    CheckBox cb = (CheckBox) vi
            .findViewById(R.id.restaurant_multi_select_checkBox);
    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            if (isChecked) {
                status.set(position, true);
            } else {
                status.set(position, false);
            }
        }
    });
    cb.setChecked(status.get(position));
    boolean allFalse = true;
    int j = 0;
    while (j < status.size() && allFalse) {
        if (status.get(j))
            allFalse = false;
        j++;
    }
    if (allFalse)
        layout.setVisibility(LinearLayout.INVISIBLE);
    else
        layout.setVisibility(LinearLayout.VISIBLE);

    HashMap<String, String> restaurant = data.get(position);
    name.setText(restaurant.get("name"));

    image.setImageResource(Integer.parseInt(restaurant.get("image")));
    return vi;
}

allFalse変数を確認する

主な活動で

layout = (LinearLayout) findViewById(R.id.llButtons);

        lvRestaurants = (ListView) findViewById(R.id.lvRestaurants);

        ArrayList<HashMap<String, String>> alist = new ArrayList<HashMap<String, String>>();
        for (int i = 0; i < restaurants.length; i++) {
            HashMap<String, String> hm = new HashMap<String, String>();
            hm.put("image", R.drawable.mcdonalds + "");
            hm.put("name", restaurants[i]);
            alist.add(hm);
        }
        RestaurantAdapter ra = new RestaurantAdapter(this, alist, layout);
        lvRestaurants.setAdapter(ra);

これはxmlです

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/lvRestaurants"
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:layout_height="0dip" >
    </ListView>

    <LinearLayout
        android:id="@+id/llButtons"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"

        android:orientation="horizontal" >

        <Button
            android:id="@+id/bDone"
            android:layout_width="153dp"
            android:layout_height="match_parent"
            android:text="Done" />

        <Button
            android:id="@+id/bCancel"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="Cancel" />
    </LinearLayout>

</LinearLayout>
4

1 に答える 1

4

setVisibility(View.GONE)ボタンを非表示にするだけでなく、レイアウト内のスペースを占有しないようにするために使用します (ボタンの代わりに黒が表示される場合)。

それらがチェックされたときに再表示されない場合は、statusオブジェクトにリスナーを追加するか、呼び出しra.notifyDataSetChanged()てリストビューを再描画する必要があります (これにより、 onDraw() ロジックが実行されます)。

編集:アダプタの外部で onCheckedChangeListener を宣言してそれを使用するのが最も簡単な場合があります。チェックボックスの数を記録するには、整数を使用します。

private int checkedBoxs = 0;
private final CheckBox.OnCheckedChangeListener listener = 
    new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                status.set(position, true);
                checkedBoxs++;
                if (layout.getVisibility() == View.GONE)
                    layout.setVisibility(View.VISIBLE);
            } else {
                status.set(position, false);
                checkedBoxs--;
                if (checkedBoxs == 0)
                    layout.setVisibility(View.GONE);
            }
        }
    };

そしてcb.setOnCheckedChangeListener(listener)、あなたの onDraw() で行います。onDraw() から他のすべての allFalse ロジックを削除します

于 2013-01-22T23:06:29.467 に答える