【Android】VideoViewを使って動画再生アプリを作る③
-- カスタムリストビュー --
ListViewコントロールをカスタマイズして、1つのレコードに様々な情報を表示する方法です。
実装
アイテムクラス
まずはListViewの1レコードを表すアイテムクラスの定義です。次の属性を持ちます。
- ファイル名
- ディレクトリ
- サイズ
- 最終更新日
Item.java
import java.util.Date;
public class Item {
private String name;
private String path;
private long size;
private Date lastModified;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setPath(String path) {
this.path = path;
}
public String getPath() {
return path;
}
public void setSize(long size) {
this.size = size;
}
public long getSize() {
return size;
}
public void setLastModified(Date lastModified) {
this.lastModified = lastModified;
}
public Date getLastModified() {
return lastModified;
}
}
レイアウト
1レコード分のレイアウトを定義します。
layout/list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_list"
android:orientation="vertical"
android:background="#fff"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/file_name"
android:layout_weight="0.6"
android:textSize="18dp"
android:textColor="@color/colorPrimaryDark"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:paddingLeft="10dp" />
<LinearLayout
android:layout_weight="0.4"
android:orientation="vertical"
android:layout_marginRight="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/file_size"
android:layout_gravity="right"
android:textSize="14dp"
android:text="-"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/file_last_modified"
android:layout_gravity="right"
android:textSize="10dp"
android:text="-"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/file_path"
android:textSize="14dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#777"
android:paddingBottom="8dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:gravity="left"
android:singleLine="false"
android:text="" />
<View
android:layout_width="match_parent"
android:layout_height="1sp"
android:background="@color/separate_line" />
</LinearLayout>
デザイン
DesignViewで見るとこんな感じ
ArrayAdapterを継承したAdapterクラス
android.widget.ArrayAdapterを継承したクラスを作成します。コンストラクタで上記レイアウトのidとListViewにセットするアイテムのリストを受け取りメンバー変数にセットします。
getViewメソッドはメンバー変数にセットされたアイテムのリストから指定されたインデックスのレコードをconvertViewにバインドして返却します。
public class ListAdapter extends ArrayAdapter<Item> {
private int resource;
private List<Item> items;
private LayoutInflater inflater;
public ListAdapter(Context context, int resource, List<Item> items) {
super(context, resource, items);
this.context = context;
this.resource = resource;
this.items = items;
this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView != null) {
view = convertView;
} else {
view = inflater.inflate(resource, null);
}
LinearLayout layoutList = view.findViewById(R.id.layout_list);
// リストビューに表示する要素を取得
Item item = items.get(position);
// ファイル名
TextView fileName = view.findViewById(R.id.file_name);
fileName.setText(item.getName());
// サイズ
TextView fileSize = view.findViewById(R.id.file_size);
fileSize.setText(item.getSize() + " MB");
// 最終更新
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
TextView fileLastModified = view.findViewById(R.id.file_last_modified);
fileLastModified.setText(format.format(item.getLastModified()));
// パス
TextView filePath = view.findViewById(R.id.file_path);
filePath.setText(item.getPath());
return view;
}
}
リストアイテムのセット
上記のListAdapterクラスに1レコード分のレイアウトのidと、アイテムのリストを設定したものを、ListViewのsetAdapterメソッドで設定してやればOKです。
ListAdapter adapter = new (this, R.layout.list_item, listItems);
listView.setAdapter(adapter);
コメント
コメントを投稿