12

ExpandableListViewが拡張されない理由を一生理解できません...ExpandableListViewで見つけたほぼすべてのクリックリスナーでログステートメントを使用しましたが、いずれも呼び出されていないようです。

このトピックに関する投稿がたくさんあることは知っていますが、それらすべてを読み、多くのことを試しましたが、運が悪かったので、他の誰かが簡単に見つけられる小さなエラーを見逃していることを願っています。

主な活動:

public class ForumListActivity extends Activity  {

    private static ArrayList<Forum> forumList;
    private static ArrayList<ArrayList<SubForum>> subForumList;
    private ExpandableListView forumListView;
    private ForumListAdapter forumListAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.main_page);
        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        forumListView = (ExpandableListView) this.findViewById(R.id.main_page_forum_list);

        forumList = new ArrayList<Forum>();
        subForumList = new ArrayList<ArrayList<SubForum>>();
        setUpForums(this);

        forumListAdapter = new ForumListAdapter(this, forumList, subForumList);
        forumListView.setAdapter(forumListAdapter);

        forumListView.setOnGroupExpandListener(new OnGroupExpandListener(){
            @Override
            public void onGroupExpand(int groupPosition) {
                Log.d("onGroupExpand", "this works?");
                for(int i=0; i<forumListAdapter.getGroupCount(); i++) {
                    if(i != groupPosition) 
                        forumListView.collapseGroup(groupPosition);
                }
            }
        });

        forumListView.setOnGroupClickListener(new OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                Log.d("onGroupClick:", "worked");
                parent.expandGroup(groupPosition);
                return true;
            }
        });
    }

注:メソッドsetUpForums()は、システム配列を取得し、それらをforumListとsubForumListに配置するだけです。

ListViewAdapter:

public class ForumListAdapter extends BaseExpandableListAdapter {

    private ArrayList<Forum> groups;
    private ArrayList<ArrayList<SubForum>> children;
    private Context ctx;

    public ForumListAdapter(Context ctx, ArrayList<Forum> groups, ArrayList<ArrayList<SubForum>> children) {
        this.ctx = ctx;
        this.groups = groups;
        this.children = children;
    }



    @Override
    public Object 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, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(ctx);
            convertView = inflater.inflate(R.layout.forum_list_child_item_row, null);
        }

        SubForum currentSubForum = children.get(groupPosition).get(childPosition);
        TextView name = (TextView)convertView.findViewById(R.id.child_row_forum_title);
        TextView desc = (TextView)convertView.findViewById(R.id.child_row_forum_description);

        if (name != null)
            name.setText(currentSubForum.getName());

        if (desc != null)
            desc.setText(currentSubForum.getDescription());

        convertView.setFocusableInTouchMode(true);
        return convertView;
    }



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



    @Override
    public Object 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) {
        if (convertView == null)
        {
            LayoutInflater inflater = LayoutInflater.from(ctx);
            convertView = inflater.inflate(R.layout.forum_list_group_item_row, null);
        }

        Forum currentForum = (Forum) groups.get(groupPosition);
        TextView name = (TextView) convertView.findViewById(R.id.group_item_forum_title);
        //ImageView image = (ImageView) convertView.findViewById(R.id.group_item_expander_image);

        if(name != null)
            name.setText(currentForum.getName());           

        /*
        if(image != null) {
            int[][] group_state_sets = {{}, {android.R.attr.state_expanded}};
            image.setVisibility(View.VISIBLE);  
            int stateSetIndex = (isExpanded ? 1 : 0) ;  
            Drawable drawable = image.getDrawable();  
            drawable.setState(group_state_sets[stateSetIndex]);  
        }
        */

        return convertView;
    }



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



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


}

グループレイアウト:

<?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"
    android:background="@drawable/turquoise_gradient"
    android:orientation="horizontal"
    android:paddingTop="6dip"
    android:paddingBottom="6dip"
    android:paddingLeft="6dip" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/turquoise_gradient"
        android:orientation="vertical"
        android:padding="2dip" >

        <TextView
            android:id="@+id/group_item_forum_title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|left"
            android:gravity="left"
            android:paddingLeft="5dip"
            android:textColor="@color/white"
            android:textSize="16dip" />

    </LinearLayout>

    <!--  
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:gravity="center|right">

        <ImageView
            android:id="@+id/group_item_expander_image"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/collapse_down" />


    </LinearLayout> -->

</LinearLayout>

子のレイアウト:

<?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"
    android:background="@drawable/turquoise_gradient"
    android:orientation="horizontal"
    android:paddingTop="6dip"
    android:paddingBottom="6dip"
    android:paddingLeft="6dip" >


    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="2dip"
        android:background="@drawable/turquoise_gradient" >

        <TextView
            android:id="@+id/child_row_forum_title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:layout_gravity="center_vertical"
            android:paddingLeft="5dip"
            android:textColor="@color/white"
            android:maxLines="1"
            android:textSize="11dip"  />

         <TextView
            android:id="@+id/child_row_forum_description"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:layout_gravity="center_vertical"
            android:paddingLeft="15dip"
            android:textColor="@color/white"
            android:maxLines="2"
            android:textSize="11dip"  />

    </LinearLayout>

</LinearLayout>

メインページのレイアウト:

<?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"
    android:background="@color/black"
    android:orientation="vertical" >

    <ExpandableListView
        android:id="@+id/main_page_forum_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/black"
        android:divider="@color/black"
        android:dividerHeight="1dip"
        android:clickable="true" />

</LinearLayout>

あなたが提供できるどんな助けも大歓迎です!

4

11 に答える 11

25

私もあなたのような同様の問題に遭遇しました。数日間の調査の後、私は何か間違ったことをしたことに気づきました。そこで、小さな変更を加えて正しく動作するように修正しました。

boolean onGroupClick(...)の本体を見てみましょうsetOnGroupClickListener「クリックが処理された」という意味のtrueが返されました

拡張する場合はfalseを返す必要があります。だから私はあなたがこのようにすることをお勧めします:

forumListView.setOnGroupClickListener(new OnGroupClickListener() {
    @Override
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
            Log.d("onGroupClick:", "worked");
            parent.expandGroup(groupPosition);
            return false;
        }
    });

android.widget.ExpandableListViewクラスには、グループの展開/折りたたみ、または適切な子へのクリックの受け渡しを担当するという名前のメソッドがありますboolean handleItemClick(View v, int position, long id)

 /* It's a group click, so pass on event */
         if (mOnGroupClickListener != null) {
             if (mOnGroupClickListener.onGroupClick(this, v,
                     posMetadata.position.groupPos, id)) {
                 posMetadata.recycle();
                 return true;
             }
         }

  /* expanding/collapsing/other tasks... */

onGroupClicktrueを返すように実装すると、8行目より下のコードは実行されません。(つまり、グループが折りたたまれたり、拡張されたりすることはありません)

私の答えがあなたのお役に立てば幸いです:-)頑張ってください!

于 2012-07-14T16:02:51.327 に答える
25

ボタンなどのウィジェットがリストアイテムにある場合は、ウィジェットに追加android:focusable="false"する必要があります。ボタンは私のリストアイテムがクリックされるのを許していませんでした。それが私の場合の問題でした。

于 2015-07-10T16:41:25.413 に答える
7

おそらく3つのことを確認する必要があります。

  1. 子供に利用できるデータがあるかどうかを確認します。データがない場合は、子供はまったく表示されません。

2.レイアウトインフレータを使用しているときに状態チェックの場合は削除してみてください

 if (convertView == null) {
    LayoutInflater inflater = LayoutInflater.from(ctx);
    convertView = inflater.inflate(R.layout.forum_list_child_item_row, null);
    }
  1. Viewgroupここも通過する必要があります

      convertView = inflater.inflate(R.layout.forum_list_child_item_row,parent, false);
    
于 2012-06-13T05:07:58.053 に答える
5

私はこれがすでに答えられていることを知っていますが、属性を持つように膨らませているものの基本レイアウトを設定してみてください:

android:descendantFocusability="blocksDescendants"
于 2016-08-31T15:21:39.203 に答える
4

拡張可能なリストビューの親にボタンまたはスイッチがある場合、それは呼び出されません。私はこれで一日を無駄にしました。したがって、以下のコードを使用してください

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

このコードをトグルボタン、スイッチボタン、または拡張可能なリストビューにあるものの中に追加します

于 2018-04-11T05:50:11.333 に答える
3

カスタムグループレイアウトが「true」になっていないことを確認してくださいandroid:textIsSelectable="false"。textviewのテキストがselectableに設定されている場合、展開可能なリストビューはジンジャーブレッドでは展開されますが、ジェリービーンズでは展開されず、ICSでも機能しない可能性があります。

于 2013-03-02T08:11:27.157 に答える
1

android:clickable="true"同様の問題が発生しましたが、xmlのExpandableListViewからプロパティを削除することで解決しました。

于 2014-12-17T13:49:13.980 に答える
0

implements OnGroupExpandListenerアクティビティに追加します。その後、それは動作します。私は同じものを使用していますが、正常に動作します。

于 2012-06-13T06:24:12.013 に答える
0

拡張可能なリストを使用している場合、グループ拡張がデフォルトの機能です。つまり、グループはクリックしたときにのみ展開されます。onGroupExpand(int groupPosition)やその他のメソッドを上書きする必要はなく、次のようにデータをリストに入力するだけです。

   public class MyActivity extends Activity { 

  private ExpandableListView forumListView;
  private ForumListAdapter forumListAdapter;
  String[] forumList={"group 1","group 2","group 3"};
 String[][] subForumList={{"group 1 child1","group 1 child1","group 1 child3"},
                     {"group 2 child1","group 2 child2","group 2 child3"},
                     {"group 3 child1","group 3 child2","group 3 child3"},
                     };
     @Override
     public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);


forumListView = (ExpandableListView) this.findViewById(R.id.main_page_forum_list);




forumListAdapter = new ForumListAdapter(this, forumList, subForumList);
forumListView.setAdapter(forumListAdapter);



  /* forumListView.setOnGroupExpandListener(new OnGroupExpandListener(){
    public void onGroupExpand(int groupPosition) {
        Log.d("onGroupExpand", "this shit works?");
        for(int i=0; i<forumListAdapter.getGroupCount(); i++) {
            if(i != groupPosition) 
                forumListView.collapseGroup(groupPosition);
        }
    }
});

forumListView.setOnGroupClickListener(new OnGroupClickListener() {
     public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long  id) {
        Log.d("onGroupClick:", "worked");
        parent.expandGroup(groupPosition);
        return true;
    }
});*/
     }

    public class ForumListAdapter extends BaseExpandableListAdapter {

      String[] groups;
   String[][] children;
     private Context ctx;

   public ForumListAdapter(Context ctx, String[] groups, String[][] children) {
    this.ctx = ctx;
    this.groups = groups;
    this.children = children;
}

public Object getChild(int arg0, int arg1) {
    // TODO Auto-generated method stub
    return children[arg0][arg1];
}

public long getChildId(int arg0, int arg1) {
    // TODO Auto-generated method stub
    return arg1;
}

public View getChildView(int arg0, int arg1, boolean arg2, View arg3,
        ViewGroup arg4) {
    if (arg3 == null) {
        LayoutInflater inflater = LayoutInflater.from(ctx);
        arg3 = inflater.inflate(R.layout.child, null);
    }

    String childData = children[arg0][arg1];
    TextView name = (TextView)arg3.findViewById(R.id.child_row_forum_title);
    TextView desc = (TextView)arg3.findViewById(R.id.child_row_forum_description);

    if (name != null)
        name.setText(childData);

    if (desc != null)
       // desc.setText(currentSubForum.getDescription());

    arg3.setFocusableInTouchMode(true);
    return arg3;}

public int getChildrenCount(int arg0) {
    // TODO Auto-generated method stub
    return children[arg0].length;
}

public Object getGroup(int arg0) {
    // TODO Auto-generated method stub
    return groups[arg0];
}

public int getGroupCount() {
    // TODO Auto-generated method stub
    return groups.length;
}

public long getGroupId(int arg0) {
    // TODO Auto-generated method stub
    return arg0;
}

public View getGroupView(int arg0, boolean arg1, View arg2, ViewGroup arg3) {
    if (arg2 == null)
    {
        LayoutInflater inflater = LayoutInflater.from(ctx);
        arg2 = inflater.inflate(R.layout.group, null);
    }


    TextView name = (TextView) arg2.findViewById(R.id.group_item_forum_title);
    //ImageView image = (ImageView) arg2.findViewById(R.id.group_item_expander_image);

    if(name != null)
        name.setText(groups[arg0]);           

    /*
    if(image != null) {
        int[][] group_state_sets = {{}, {android.R.attr.state_expanded}};
        image.setVisibility(View.VISIBLE);  
        int stateSetIndex = (isExpanded ? 1 : 0) ;  
        Drawable drawable = image.getDrawable();  
        drawable.setState(group_state_sets[stateSetIndex]);  
    }
    */

    return arg2;}

public boolean hasStableIds() {
    // TODO Auto-generated method stub
    return false;
}

public boolean isChildSelectable(int arg0, int arg1) {
    // TODO Auto-generated method stub
    return false;
}
    }

       }
于 2012-06-13T07:02:00.060 に答える
0

forumListView.collapseGroup(groupPosition);

する必要があります

forumListView.collapseGroup(i);

于 2015-03-14T21:38:11.130 に答える
0

私の場合、グループビューと子ビューにボタンがありandroid:focusable="false" android:focusableInTouchMode="false"、両方に設定しても機能しませんでした。

だから私はそれらをからに変更しなければなりませんでしImageButtonImageView。クリックのリスナーは同じです。のタッチアニメーションを与えるために、カスタム背景を作成する必要がある場合がありますImageView

于 2020-02-19T17:43:03.933 に答える