Hide button in ExpandableListView

I just got the ExpandableListView installed and everything works fine. In the / parent group, I have a TextView and and a Button. The purpose of this list is for people to try different sounds included in the app and they press a button, after which the sounds will be saved to the SD card. Here's a link to what I have so far: http://imgur.com/djSCIrG

My question is, is it possible, when someone clicks a button and selects to buy a package, if only one button can be hidden and not all buttons in each group.

Here is my main layout (expandablelistview_main.xml):

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

        <TextView
            android:id="@+id/soundpacktitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/expandablelistview_main_soundpacktitle_topmargin"
            android:layout_centerHorizontal="true"
            android:text="@string/soundpacktitle"
            android:textSize="@dimen/expandablelistview_main_soundpacktitle_textsize" />

        <ExpandableListView 
            android:id="@+id/soundpacklist" 
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_below="@+id/soundpacktitle"
            android:layout_above="@+id/soundpackbottombar"
            android:layout_marginTop="@dimen/expandablelistview_main_soundpacklist_topmargin"
            android:transcriptMode="disabled"
            android:cacheColorHint="#00000000"
            android:listSelector="@android:color/transparent" />   
    </RelativeLayout> 

      

Here is my group / parent layout (expandablelistview_group.xml):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/grouptextview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:gravity="center_vertical"
        android:layout_marginLeft="@dimen/expandablelistview_group_grouptextview_leftmargin"        
        android:textSize="@dimen/expandablelistview_group_grouptextview_textsize" />

    <Button
        android:id="@+id/buypackbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:layout_alignParentRight="true" 
        android:focusable="false" 
        android:focusableInTouchMode="false"
        android:text="@string/buypack"
        android:padding="@dimen/expandablelistview_group_buypackbutton_padding"
        android:textSize="@dimen/expandablelistview_group_buypackbutton_textsize"
        android:textStyle="bold" />

</RelativeLayout>

      

Here is my java class:

public class InAppSounds extends Activity {
    private ExpandableListView soundpacklist;

    private ArrayList<String> groups;
    private ArrayList<ArrayList<ArrayList<String>>> childs;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.expandablelistview_main);

        TextView soundpacktitle = (TextView) findViewById(R.id.soundpacktitle);
        soundpacktitle.setTypeface(printbold);

        // Declare the ExpandableListView and set the indicator to the list arrows
        soundpacklist = (ExpandableListView) findViewById(R.id.soundpacklist);
        soundpacklist.setGroupIndicator(getResources().getDrawable(R.drawable.list_groupselector));

        LoadData();

        myExpandableAdapter adapter = new myExpandableAdapter(this, groups, childs);
        soundpacklist.setAdapter(adapter);
    }

    // Loads the ExpandableListView with parent and children groups
    private void LoadData() {
        groups = new ArrayList<String>();
        childs = new ArrayList<ArrayList<ArrayList<String>>>();

        // String array that stores the parent and child names
        String[] soundpackgroups = getResources().getStringArray(R.array.soundpackgroups);
        String[] soundpack1 = getResources().getStringArray(R.array.soundpack1);
        String[] soundpack2 = getResources().getStringArray(R.array.soundpack2);
        String[] soundpack3 = getResources().getStringArray(R.array.soundpack3);

        // First Sound Pack and their songs
        groups.add(soundpackgroups[0]);
        childs.add(new ArrayList<ArrayList<String>>());
        for (int a = 0; a < soundpack1.length; a++) {
            childs.get(0).add(new ArrayList<String>());
            childs.get(0).get(a).add(soundpack1[a]);
        }

        // Second Sound Pack and their songs
        groups.add(soundpackgroups[1]);
        childs.add(new ArrayList<ArrayList<String>>());
        for (int a = 0; a < soundpack2.length; a++) {
            childs.get(1).add(new ArrayList<String>());
            childs.get(1).get(a).add(soundpack2[a]);
        }

        // Third Sound Pack and their songs
        groups.add(soundpackgroups[2]);
        childs.add(new ArrayList<ArrayList<String>>());
        for (int a = 0; a < soundpack3.length; a++) {
            childs.get(2).add(new ArrayList<String>());
            childs.get(2).get(a).add(soundpack3[a]);
        }
    }

    public class myExpandableAdapter extends BaseExpandableListAdapter {

        private final ArrayList<String> groups;

        private final ArrayList<ArrayList<ArrayList<String>>> children;

        private final Context context;

        public myExpandableAdapter(Context context, ArrayList<String> groups,
                ArrayList<ArrayList<ArrayList<String>>> children) {
            this.context = context;
            this.groups = groups;
            this.children = childs;
        }

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

        @Override
        public ArrayList<String> getChild(int groupPosition, int childPosition) {
            return children.get(groupPosition).get(childPosition);
        }

        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }

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

            String child = getChild(groupPosition, childPosition).get(0);

            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.expandablelistview_child, null);
            }

            // TypeFace variable for the PrintBold
            printbold = Typeface.createFromAsset(getAssets(), "fonts/PrintBold.otf");

            TextView childtxt = (TextView) convertView.findViewById(R.id.childtextview);
            childtxt.setTypeface(printbold);
            childtxt.setText(child);

            return convertView;
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            return children.get(groupPosition).size();
        }

        @Override
        public String getGroup(int groupPosition) {
            return groups.get(groupPosition);
        }

        @Override
        public int getGroupCount() {
            return groups.size();
        }

        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

            final String group = getGroup(groupPosition);

            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.expandablelistview_group, null);
            }

            // TypeFace variable for the PrintBold
            printbold = Typeface.createFromAsset(getAssets(), "fonts/PrintBold.otf");

            TextView grouptxt = (TextView) convertView.findViewById(R.id.grouptextview);
            grouptxt.setTypeface(printbold);
            grouptxt.setText(group);

            final Button buypackbutton = (Button) convertView.findViewById(R.id.buypackbutton);
            buypackbutton.setClickable(true);

            buypackbutton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    AlertDialog.Builder alert = new AlertDialog.Builder(InAppSounds.this);
                    if (group.equals("Pack #1")) {
                        alert.setCancelable(false);
                        alert.setTitle(getString(R.string.buypacktitle));
                        alert.setIcon(getResources().getDrawable(R.drawable.ic_audioicon));
                        alert.setMessage(getString(R.string.buypackmsg));
                        alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // check to make sure the SD card is mounted
                                // if not display an AlertDialog
                                if (!isSDPresent()) {
                                    sdcardalert();
                                }
                                else {
                                    // this will erase the button in all the groups, not just this group
                                    buypackbutton.setVisibility(View.INVISIBLE);
                                }
                            }
                        });
                        alert.setNegativeButton("No", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        });
                        alert.show();
                    }
                }
            });

            return convertView;
        }

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

        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
    }
}

      

Any advice on this matter would be appreciated. Thanks to

+3


source to share


1 answer


Yes. It's easy. All you have to do is get the link for your button and set the visibility. Like this:

Button sampleButton = (Button) findViewById(R.id.sample_button);
sampleButton.setVisiblity(View.GONE);

      

Note. When you set it to View.GONE, the layout space that was originally granted to it is also removed. If you just want to remove the button and keep the layout space View.INVISIBLE instead.

EDIT: Here's how I will keep the button from reappearing: First, I would use a boolean to keep track of the button's status while the active is active. Then in your override, getChildView

I would check for that boolean and set visibility accordingly. Perhaps insert something like this in the callback getChildView

so that the button doesn't appear when the list item is clicked:

if (!showButton) {
Button button = (Button) findViewById(R.id.sample_button);
button.setVisibility(View.GONE);
}

      

How to return to the screen. To keep track of whether or not to show the button, I would use a boolean and store it in SharedPreferences. Then, also in the callback getChildView

, check the boolean state and set it accordingly. Something like that:



SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean showButtonStatusPref = settings.getBoolean("showButton", true);

if(!showButtonStatusPref) {
Button button = (Button) findViewById(R.id.sample_button);
button.setVisibility(View.GONE);
}

      

The only thing you need to do is manage the status of each button.

EDIT 2: I was completely missing out on the fact that the same layout is used for kids' views (crazy cramp :) :).

You can still use general settings to keep track of which samples were loaded (you can use Set to do this). You also need to create a way to assign "identifiers" to each sample. From there, all you have to do is check every time it is called getChildView()

, and if Set contains the selected pattern id, set the visibility of the button. This should take care of showing the button when the sample has not been loaded, and not showing the button when the sample has been loaded. Perhaps something like this in getChildView()

:

Set<String> defaultSet = new SortedSet<String>();
defaultSet.add("Nothing downloaded");
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SortedSet<String> listOfDowloaded = settings.getStringSet("isDownloadedList", );

if (listOfDownLoaded.contains(sampleDownloadIdentifier)) {
Button button = (Button) findViewById(R.id.some_id);
button.setVisiblity(View.GONE);
}

      

+1


source







All Articles