samtherock
samtherock

Reputation: 3048

ExpandableListView does not expanding when clicked

I am using ExpandableListView to create my custom list with child items. My first list is created successfully but It is not clickable and therefore it can not be expanded.

Here is my code ...

private ExpandableListView listview;
private TheaterListAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);


    setContentView(R.layout.theater_list);

    this.m_movieList = "A list of Movie (Custom Object)"

    listview = (ExpandableListView) findViewById(R.id.theater_listview);
    adapter = new TheaterListAdapter(getApplicationContext());
    listview.setAdapter(adapter);


private class TheaterListAdapter extends BaseExpandableListAdapter {

    public TheaterListAdapter(Context c) {
        mContext = c;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        String MovieId = m_movieList.getMovies().get(groupPosition)
                .getShowTimes().get(childPosition).getMovieId();
        for (MovieInfo movie : m_movieList.getMovies()) {
            if (MovieId.equalsIgnoreCase(movie.getId())) {
                return movie;
            }
        }
        return null;
    }

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

    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        ExpandedHolder holder;
        View rowView = convertView;

        if (rowView == null) {
            holder = new ExpandedHolder();
            LayoutInflater li = getLayoutInflater();
            rowView = li.inflate(R.layout.theater_expanded_view, null);

            holder.img_movie_poster = (ImageView) rowView
                    .findViewById(R.id.imgMoviePoster);
            holder.img_rating_star = (ImageView) rowView
                    .findViewById(R.id.imgRatingStar);
            holder.txt_movie_name = (TextView) rowView
                    .findViewById(R.id.txtMovieName);
            holder.txt_pg_duration = (TextView) rowView
                    .findViewById(R.id.txtPgDuration);
            holder.txt_showtimes = (TextView) rowView
                    .findViewById(R.id.txtShowTimes);

            rowView.setTag(holder);

        } else {
            holder = (ExpandedHolder) rowView.getTag();
        }

        holder.txt_movie_name.setText("Twilight");
        holder.txt_pg_duration.setText("PG 90 min");
        holder.txt_showtimes.setText("7:00  8:00");

        return rowView;

    }

    @Override
    public int getChildrenCount(int groupPosition) {
        String thid = m_movieList.getThreaters().get(groupPosition).getId();
        int cnt = 5;
        for (ShowTimes st : m_movieList.getMovies().get(groupPosition)
                .getShowTimes()) {
            if (thid.equalsIgnoreCase(st.getTheaterId())) {
                cnt = cnt + 1;
            }
        }

        return cnt;
    }

    @Override
    public Object getGroup(int groupPosition) {
        return m_movieList.getThreaters().get(groupPosition);
    }

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

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

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        final ParentHolder holder;
        View rowView = convertView;
        try {

            if (rowView == null) {
                holder = new ParentHolder();
                LayoutInflater li = getLayoutInflater();
                rowView = li.inflate(R.layout.theater_list_item, null);

                holder.img_star = (ImageView) rowView
                        .findViewById(R.id.imgTheaterStar);
                holder.txt_title = (TextView) rowView
                        .findViewById(R.id.txtTheaterTitle);
                holder.txt_address1 = (TextView) rowView
                        .findViewById(R.id.txtTheaterAddress1);
                holder.txt_address2 = (TextView) rowView
                        .findViewById(R.id.txtTheaterAddress2);
                holder.txt_distance = (TextView) rowView
                        .findViewById(R.id.txtTheaterDistance);
                holder.btn_map = (Button) rowView
                        .findViewById(R.id.btnMapIcon);
                rowView.setTag(holder);

            } else {
                holder = (ParentHolder) rowView.getTag();
            }


            holder.txt_title
            .setText(((TheaterInfo)getGroup(groupPosition)).getName());
            holder.txt_address1.setText("3003 North Thanksgiving way");
            holder.txt_address2.setText("Lehi, UT, United States");
            holder.txt_distance.setText("15.0 mi");
        } catch (Exception e) {

        }

        return rowView;
    }

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

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

}

/**
 * Create Viewholder to use for inflating imageviews and textview
 */
static class ParentHolder {
    Button btn_map;
    ImageView img_star;
    TextView txt_title;
    TextView txt_address1;
    TextView txt_address2;
    TextView txt_distance;
}

/**
 * Create Viewholder to use for inflating imageviews and textview
 */
static class ExpandedHolder {
    ImageView img_movie_poster;
    ImageView img_rating_star;
    TextView txt_movie_name;
    TextView txt_pg_duration;
    TextView txt_showtimes;
}
}

Upvotes: 1

Views: 3390

Answers (3)

mango
mango

Reputation: 5636

Try making the button in your group view non-focusable in your xml layout if it isn't already

Upvotes: 3

user1219188
user1219188

Reputation: 11

ChildView getView() this method, when your judge convertview equals null, you must convertview.setTag(viewHolder). When your clicked parent view second, the convertview is not equals null, your must use this viewholder= (ViewHolder)convertview.getTag();

 public View getChildView(final int groupPosition, final int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        View view = convertView;
        ChildViewHolder viewHolder = null;
        if (view == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.member_childitem2, null);
            viewHolder = new ChildViewHolder();



            viewHolder.checkBox1 = (CheckBox)view.findViewById(R.id.checkbox1);
            viewHolder.checkBox2 = (CheckBox)view.findViewById(R.id.checkbox2);
            viewHolder.checkBox3 = (CheckBox)view.findViewById(R.id.checkbox3);
            viewHolder.checkBox4 = (CheckBox)view.findViewById(R.id.checkbox4);
            viewHolder.checkBox5 = (CheckBox)view.findViewById(R.id.checkbox5);
            viewHolder.checkBox6 = (CheckBox)view.findViewById(R.id.checkbox6);


            view.setTag(viewHolder);
        }else{
            viewHolder = (ChildViewHolder) view.getTag();
        }

        Button btn_submit = (Button)view.findViewById(R.id.btn_submit);


        View groupView = cachedGroupView.get(childPosition);
        final GroupViewHolder groupViewHolder = (GroupViewHolder) groupView.getTag();
        btn_submit.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(context,
                        groupPosition+ ":"
                                + childPosition,
                        Toast.LENGTH_SHORT).show();

                groupViewHolder.groupStatus.setImageResource(R.drawable.indicator_close);
            }
        });


        return view;
    }

Upvotes: 0

Kamen
Kamen

Reputation: 3595

Can you paste the whole code - the Adapter and the ListView. The layout also is needed. Meanwhile there are two possibilities - either you set a onGroupClickListener that always returns true (so that the click does not reach the super class) or something in the XML layout prevents the click event (clickable, etc.)

Upvotes: 1

Related Questions