i have a layout with listview and under it there is linearlayout with two buttons horizantally, i want when no checkbox is checked the two buttons hide, i try to make it but my code make the two buttons hide and a black instead of them appears , and when a checkbos is checked the two buttons don’t appear, why ?
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;
}
}
check the allFalse variable
in the main activity
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);
this is the 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>
Use
setVisibility(View.GONE)to make the buttons not only be hidden, but stop occupying space in the layout, if that is what you mean by “and a black appears instead of them”.As for them not re-appearing when they are checked, you need to either add a listener on your
statusobject or callra.notifyDataSetChanged()to have the listview redrawn (which will result in the onDraw() logic being executed).Edit: It might be easiest for you to declare your onCheckedChangeListener outside the adapter and use that. Use an integer to record the number of checked boxes.
And then do
cb.setOnCheckedChangeListener(listener)in your onDraw(). Eliminate all other allFalse logic from your onDraw()