こんな感じ。
# 次の Libraroid のアップデートに組み込むつもり~
以前のエントリAndroid Expandable List を使うで、Expandable List を使うには、SimpleExpandableListAdapter を使うのが簡単だと書きましたが、今回のようにカスタマイズする場合は使えません。
参考にしたのが、ApiDemo の ExpandableList1.java です。
BaseExpandableListAdapter を継承して独自の Adapter を作ります。
キモは
getChildView() と getGroupView() です。
ここで返している View が対応する位置の行の View になります。
ここでは TextView を返していますが、Button や ImageView を
返せば、それが行のViewになります。
もちろん LinearLayout を使って複数の View の組み合わせを返す
こともできます。
元々の全ソースはここ。
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
....
public TextView getGenericView() {
// Layout parameters for the ExpandableListView
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 64);
TextView textView = new TextView(ExpandableList1.this);
textView.setLayoutParams(lp);
// Center the text vertically
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
// Set the text starting position
textView.setPadding(36, 0, 0, 0);
return textView;
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getChild(groupPosition, childPosition).toString());
return textView;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getGroup(groupPosition).toString());
return textView;
}
....
}
で、今回は子要素の最後の列を LinearLyout + Button にしてみました。
public class ExpandableListTest2 extends ExpandableListActivity {
MyExpandableListAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mybooklist_layout);
setList();
}
public void setList(){
final int LIST_SIZE = 10;
int[] rowId = new int[LIST_SIZE];
String[] parentList = new String[LIST_SIZE];
String[][] childList = new String[LIST_SIZE][3];
for(int i=0; i<LIST_SIZE ; i++){
rowId[i] = i;
parentList[i] = "Title: " + i;
childList[i][0] = "Author: " + i;
childList[i][1] = "ISBN: " + i;
childList[i][2] = "";
}
mAdapter = new MyExpandableListAdapter(rowId, parentList, childList);
setListAdapter(mAdapter);
registerForContextMenu(getExpandableListView());
}
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
private int[] rowId;
private String[] groups;
private String[][] children;
public MyExpandableListAdapter(int[] rowId, String[] groups, String[][] children){
this.rowId = rowId;
this.groups = groups;
this.children = children;
}
public int getRowId(int groupPosition) {
return rowId[groupPosition];
}
public Object getChild(int groupPosition, int childPosition) {
return children[groupPosition][childPosition];
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public int getChildrenCount(int groupPosition) {
return children[groupPosition].length;
}
public TextView getGenericView() {
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, getResources().getDimensionPixelSize(R.dimen.listHeight));
TextView textView = new TextView(ExpandableListTest2.this);
textView.setLayoutParams(lp);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(getResources().getDimensionPixelSize(R.dimen.listPadding), 0, 0, 0);
return textView;
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
// 最後の行は LinearLyout + Button を返す
if(childPosition == getChildrenCount(groupPosition) - 1) {
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, getResources().getDimensionPixelSize(R.dimen.listHeight));
AbsListView.LayoutParams lp2 = new AbsListView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
LinearLayout ll = new LinearLayout(ExpandableListTest2.this);
ll.setLayoutParams(lp);
ll.setPadding(getResources().getDimensionPixelSize(R.dimen.listPadding), 0, 0, 0);
ll.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
Button button = new Button(ExpandableListTest2.this);
button.setText("図書館検索");
button.setLayoutParams(lp2);
ll.addView(button);
return ll;
}
else {
TextView textView = getGenericView();
textView.setText(getChild(groupPosition, childPosition).toString());
return textView;
}
}
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}
public int getGroupCount() {
return groups.length;
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getGroup(groupPosition).toString());
return textView;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public boolean hasStableIds() {
return true;
}
}
}
0 件のコメント:
コメントを投稿