0

グループごとにカスタムレイアウトでAndroidExpandableListViewを使用する必要があります(グループには子が1つあります)。これを実現するために、BaseExpandableListAdapterを拡張するクラスを作成しました。getChildViewメソッドで、各子のビューを作成しました。できます。グループをクリックすると、その子には実際のレイアウトが表示されます。ただし、デバッグ中にgetchildviewメソッドが何度もトリガーされるため、子を表示するには遅すぎます。各子には多くの操作があるため(db操作、動的サブレイアウト...)。

私のプロジェクトに似た小さなプロジェクトがあります(ロジックとコード構造は同じですが、レイアウトコードと各子ビューを作成するコードのみが異なります)。

public class MainActivity extends Activity {

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

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

    setContentView(R.layout.activity_main);

    ExpandableListView l = (ExpandableListView)findViewById(R.id.expandableListView1);

    loadData();


    final myExpandableAdapter adapter = new myExpandableAdapter(this, groups, childs);
    l.setAdapter(adapter);


}

public class myExpandableAdapter extends BaseExpandableListAdapter {

    private ArrayList<String> groups;

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

    private 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;
    }


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

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


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

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

        case 0:
            LayoutInflater inflater =  (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.child_row, null);
            TextView tvPlayerName = (TextView) convertView.findViewById(R.id.tvPlayerName);
            tvPlayerName.setText(child);

            break;

        case 1:
            LayoutInflater inflater1 =  (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater1.inflate(R.layout.child_row1, null);
            TextView tvPlayerName1 = (TextView) convertView.findViewById(R.id.tvPlayerName);
            tvPlayerName1.setText(child);
            Button btn=(Button)convertView.findViewById(R.id.button1);
            btn.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    TextView tv=(TextView)findViewById(R.id.tv);
                    tv.setText("Clicked");
                }
            });

            break; 
        case 2:
            LayoutInflater inflater2 =  (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater2.inflate(R.layout.child_row1, null);
            TextView tvPlayerName12 = (TextView) convertView.findViewById(R.id.tvPlayerName);
            tvPlayerName12.setText(child);
            Button btn2=(Button)convertView.findViewById(R.id.button1);
            btn2.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    TextView tv=(TextView)findViewById(R.id.tv);
                    tv.setText("Clicked");
                }
            });

            break; 
     }
        return convertView;

    }

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

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

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

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

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

        String group = (String) getGroup(groupPosition);

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

        TextView grouptxt = (TextView) convertView.findViewById(R.id.TextViewGroup);

        grouptxt.setText(group);

        return convertView;
    }

    public boolean hasStableIds() {
        return true;
    }

    public boolean isChildSelectable(int arg0, int arg1) {
        return true;
    }

}

private void loadData(){
    groups= new ArrayList<String>();
    childs= new ArrayList<ArrayList<ArrayList<String>>>();

    groups.add("Group 1");
    groups.add("Group 2");
    groups.add("Group 3");

    childs.add(new ArrayList<ArrayList<String>>());
    childs.get(0).add(new ArrayList<String>());
    childs.get(0).get(0).add("Child 1 group 1");


    childs.add(new ArrayList<ArrayList<String>>());
    childs.get(1).add(new ArrayList<String>());
    childs.get(1).get(0).add("Child 1 group 2");


    childs.add(new ArrayList<ArrayList<String>>());
    childs.get(2).add(new ArrayList<String>());
    childs.get(2).get(0).add("Child 1 group 3");

}}

デバッグ中に、いずれかのグループをクリックすると、String child=(String)getChild(groupPosition, childPosition).get(0);行になります。その後break; }return convertView;、何度もそこに来て、レイアウトを表示します。

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

<ExpandableListView
    android:id="@+id/expandableListView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="34dp" >
</ExpandableListView>

Expandablelistview_group.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"> 
<TextView
    android:id="@+id/TextViewGroup" 
    android:layout_width="wrap_content"
    android:layout_height="50px"
    android:layout_marginLeft="50px"
    android:gravity="center_vertical"
>
</TextView>

child_row.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:id="@+id/tvPlayerName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="CheckBox" />

childrow1.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:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Row1" />

<TextView
    android:id="@+id/tvPlayerName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />

これを解決するための提案はありますか?

ありがとう

4

2 に答える 2

2

使用からビューを膨らませる代わりにgetChildViewホルダー はここを読んでください

于 2012-09-20T08:30:02.097 に答える
1

ExpandableListView xmlを変更してみてください。android:layout_height = "wrap_content"の代わりに、android:layout_height=" fill_parent "を配置してください

于 2012-10-05T18:51:03.283 に答える