私はアンドロイドが初めてで、下の画像のような ListView を実装したいと考えています。expandableListView は私の要求を満たすかもしれませんが、私が望むのはItem 4
子だけで展開できることです。「項目 1」はユーザーがクリックできるオプションであり、展開することはできません。Expandable List View のドキュメントを読みましたが、これを実装する方法が十分に明確ではありません。誰かがこれを実装することについて何か提案できますか? どうもありがとう
3 に答える
しかし、私が欲しいのは、アイテム4だけが子を持ち、展開できることです
Item に子がない場合、展開されません。次のようにイメージできます。
public class Item {
private String title;
private List<Option> children; // if size = 0 won't be expanded
}
これはネイティブの動作であるExpandableListView
ため、アイテムに子がない場合、暗黙的に展開されませんが、グループ (アイテム) と子 (オプション) の両方に OnClickListener を設定する必要があります。
public boolean onChildClick(ExpandableListView parent, View row,
int groupPosition, int childPosition, long id) {
// callback method after click for Options
return false;
}
public boolean onGroupClick(ExpandableListView parent, View row,
int groupPosition, long id) {
/** if you are using BaseAdapter subclass implementation **/
adapter.getGroup(groupPosition)).getChildren() == null) {
// item doesn't have children
}
else {
// has children
}
一般に、ListView をより詳細に制御したい場合は、 BaseExpandableListAdapter を使用できる場合に ListAdapter の独自のサブクラスを実装することをお勧めします。
また、リストの外観は、適切なスタイルのレイアウトに関する問題のみです。たとえば、グループ インジケーターを削除する
android:groupIndicator="@null"
アップデート:
@Roberto Lombardini が言及した問題:
このソリューションの小さな問題は、グループに子がなくても、グループ ビューの状態 (展開されているかどうか) を示す小さな灰色の三角形が表示されることです。私が間違っている?
子を持つアイテムにのみ灰色の三角形を使用したい場合は、getGroupView()
メソッドのカスタム アダプターで修正する必要があります。
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// inflating View etc.
Item item = items.get(groupPosition);
if (item != null) {
// if Item has children
if (item.getChildren() != null && !item.getChildren().isEmpty()) {
// set children indicator to VISIBLE
imageView.setVisibility(ImageView.VISIBLE);
}
// if Item doesn't have children
else {
// set children indicator to GONE
imageView.setVisibility(ImageView.GONE);
}
}
}
lv.setOnGroupClickListener(new OnGroupClickListener() {
public boolean onGroupClick(ExpandableListView parent, View v, int position, long id) {
switch (position) {
case 0: return true;
case 2: return true; // returning true wont expand
default:
return false;// if you return false then only that position will be expanded
}
}
}
);
展開したい親の位置と展開したくない親の位置で false を返すだけで、true を返すことができます。
カスタムアダプターを実装してみてください。必要なことを行うためのより良い方法になると思います