自定义ExpandableListView无法正常工作

时间:2016-02-05 06:18:15

标签: android expandablelistview

我创建了自定义ExpandableListView,但点击它时它不会展开。

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<ExpandableListView 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/exp_lv"
    ></ExpandableListView>

group_items.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="horizontal" >


<TextView 
    android:layout_width="270sp"
    android:layout_height="30sp"
    android:layout_marginLeft="30sp"
    android:id="@+id/title"
    android:textIsSelectable="true"
    />

<CheckBox 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/chk"
    />

child_items.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" >


<TextView 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/child"
    android:textIsSelectable="true"
    />
<RelativeLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
    <TextView 
    android:layout_width="120sp"
    android:layout_height="wrap_content"
    android:textIsSelectable="true"
    android:id="@+id/dd"
    android:textStyle="bold"
    />

    <TextView 
        android:layout_width="200sp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/dd"
        android:textIsSelectable="true"
        android:id="@+id/date"
        />
</RelativeLayout>

group.java

package com.example.expandablelistview;

import java.util.ArrayList;

public class group {

private String Name;
private boolean isSelected;
private ArrayList<child> Items;

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public boolean isSelected() {
    return isSelected;
}

public void setSelected(boolean isSelected) {
    this.isSelected = isSelected;
}

public ArrayList<child> getItems() {
    return Items;
}

public void setItems(ArrayList<child> items) {
    Items = items;
}
}

child.java

package com.example.expandablelistview;

public class child {

String child_title;
String dd;
String date;
public String getChild_title() {
    return child_title;
}
public void setChild_title(String child_title) {
    this.child_title = child_title;
}
public String getDd() {
    return dd;
}
public void setDd(String dd) {
    this.dd = dd;
}
public String getDate() {
    return date;
}
public void setDate(String date) {
    this.date = date;
}
}

MyBaseAdapter.java

package com.example.expandablelistview;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.TextView;

public class MyBaseAdapter extends BaseExpandableListAdapter{
Context context;
ArrayList<group> group_al;

public MyBaseAdapter(Context context,ArrayList<group> group_al) {
this.context=context;
this.group_al=group_al;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
    ArrayList<child> chList = group_al.get(groupPosition).getItems();

    return chList.get(childPosition);
}

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

    return childPosition;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
        ViewGroup parent) {
     child ch = (child) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context
                    .getSystemService(context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.child_items, null);
        }
        TextView child = (TextView) convertView.findViewById(R.id.child);
        TextView dd = (TextView) convertView.findViewById(R.id.dd);
        TextView date= (TextView) convertView.findViewById(R.id.date);

        child.setText(ch.getChild_title().toString());
        dd.setText(ch.getChild_title().toString());
        date.setText(ch.getChild_title().toString());

        return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    ArrayList<child> chList = group_al.get(groupPosition).getItems();

    return chList.size();
}

@Override
public Object getGroup(int groupPosition) {

    return group_al.get(groupPosition);
}

@Override
public int getGroupCount() {

    return group_al.size();
}

@Override
public long getGroupId(int groupPosition) {

    return groupPosition;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    group gr = (group) getGroup(groupPosition);
    long group_id = getGroupId(groupPosition);
    if (convertView == null) {
        LayoutInflater inf = (LayoutInflater) context
                .getSystemService(context.LAYOUT_INFLATER_SERVICE);
        convertView = inf.inflate(R.layout.group_items, null);
    }

    TextView title = (TextView) convertView.findViewById(R.id.title);
    title.setText(gr.getName());
    CheckBox chk=(CheckBox) convertView.findViewById(R.id.chk);
    chk.setFocusable(false);

    return convertView;
}

@Override
public boolean hasStableIds() {

    return true;
}

@Override
public boolean isChildSelectable(int arg0, int arg1) {

    return false;
}

}

MainActivity.java

package com.example.expandablelistview;

import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.widget.ExpandableListView;

public class MainActivity extends Activity {
private MyBaseAdapter ExpAdapter;
private ArrayList<group> ExpListItems;
private ExpandableListView ExpandList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ExpandList = (ExpandableListView) findViewById(R.id.exp_lv);
    ExpListItems = SetStandardGroups();
    ExpAdapter = new MyBaseAdapter(MainActivity.this, ExpListItems);
    ExpandList.setAdapter(ExpAdapter);
}

private ArrayList<group> SetStandardGroups() {

    ArrayList<group> list = new ArrayList<group>();
    group gru= new group();
    gru.setName("Tax 1");

    ArrayList<child> ch_list= new ArrayList<child>();
    child ch = new child();
    ch.setChild_title("Information of tax 1");
    ch.setDd("Due Date:");
    ch.setDate("22/02/2016");

    ch_list.add(ch);

gru.setItems(ch_list);
list.add(gru);

    return list;
}
}

当我运行该应用程序时,我可以看到ExpandableListView的第一行,即Tax1旁边有CheckBox,但是当我点击该行时它就不会展开。

请伙计们帮助我。 提前谢谢。

4 个答案:

答案 0 :(得分:0)

请添加:

android:focusable="false"
android:focusableInTouchMode="false"

到您的复选框

也从textView中删除:

 android:textIsSelectable="true"

答案 1 :(得分:0)

**

<?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="horizontal" >
<TextView 
    android:layout_width="270sp"
    android:layout_height="30sp"
    android:layout_marginLeft="30sp"
    android:id="@+id/title"
    ****android:textIsSelectable="true"**// remove this line in group layout**
    />
<CheckBox 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/chk"
    />

**

答案 2 :(得分:0)

In MybaseAdapter please change method like this

@Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
                             ViewGroup parent) {
        child ch = (child) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context
                    .getSystemService(context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.child_items, null);
        }
        TextView child = (TextView) convertView.findViewById(R.id.child);
        TextView dd = (TextView) convertView.findViewById(R.id.dd);
        TextView date= (TextView) convertView.findViewById(R.id.date);

        child.setText(ch.getChild_title().toString());
        dd.setText(ch.getDd().toString());
        date.setText(ch.getDate().toString());

        return convertView;
    }

答案 3 :(得分:0)

当我添加

android:focusable="false"
android:focusableInTouchMode="false"

到你的复选框和

 android:textIsSelectable="true"

到TextView 然后它很棒 但现在我想将检查的CheckBox值(只有group_title和Date TextView的值)存储到数据库中,这样我在Checkbox上添加clickListener