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>
あなたが提供できるどんな助けも大歓迎です!
私もあなたのような同様の問題に遭遇しました。数日間の調査の後、私は何か間違ったことをしたことがわかりました。そこで、小さな変更を加えることで正しく機能するように修正しました。
setOnGroupClickListener
のboolean onGroupClick(...)
の本体を見てみましょう。 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... */
_
onGroupClick
をreturn trueに実装すると、8行目より下のコードは実行されません。 (つまり、グループが折りたたまれたり、拡張されたりすることはありません)
私の答えがあなたのお役に立てば幸いです:-)頑張ってください!
ボタンなどのウィジェットがリストアイテムにある場合は、それにAndroid:focusable="false"
を追加する必要がある場合があります。ボタンでリストアイテムをクリックできませんでした。それが私の場合の問題でした。
おそらく、確認する必要がある3つのことがあります。
2.レイアウトインフレータ使用中に状態チェックの場合は取り外してみてください
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(ctx);
convertView = inflater.inflate(R.layout.forum_list_child_item_row, null);
}
ここでもViewgroup
を渡す必要があります
convertView = inflater.inflate(R.layout.forum_list_child_item_row,parent, false);
拡張可能なリストビューの親にボタンまたはスイッチがある場合、それは呼び出されません。私はこれで一日を無駄にしました。したがって、以下のコードを使用してください
Android:focusable="false"
Android:focusableInTouchMode="false"
このコードをトグルボタン、スイッチボタン、または展開可能なリストビューにあるものの中に追加します
私はこれがすでに答えられていることを知っていますが、あなたが膨らませているものの基本レイアウトを設定して、属性を持つようにしてください:
Android:descendantFocusability="blocksDescendants"
カスタムグループレイアウトにAndroid:textIsSelectable="false"
が "true"として含まれていないことを確認してください。テキストビューのテキストが選択可能に設定されている場合、展開可能なリストビューはジンジャーブレッドでは展開されますが、ジェリービーンズでは展開されず、ICSも。
同様の問題が発生しましたが、xmlのExpandableListViewからAndroid:clickable="true"
プロパティを削除することで解決しました。
追加 implements OnGroupExpandListener
あなたの活動に。その後、それは動作します。私は同じものを使用していますが、正常に動作します。
forumListView.collapseGroup(groupPosition);
する必要があります
forumListView.collapseGroup(i);
私の場合、グループビューと子ビューにボタンがあり、両方にAndroid:focusable="false"
Android:focusableInTouchMode="false"
を設定しても機能しませんでした。
そのため、それらをImageButton
からImageView
に変更する必要がありました。クリックのリスナーは同じです。 ImageView
のタッチアニメーションを与えるために、カスタム背景を作成する必要がある場合があります。
展開可能なリストを操作している場合、グループ展開はデフォルトの機能です。つまり、グループはクリックしたときにのみ展開され、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;
}
}
}