Android
リストビュー
サーチ…
前書き
ListViewは配列やデータベースのようなデータソースからいくつかの項目をグループ化し、それらをスクロール可能リストに表示するビューグループです。データは、Adapterクラスを使用してリストビューにバインドされます。
備考
ListView
は、スクロール可能な項目のリストを表示するビューグループです。
リストアイテムは、配列やデータベースクエリなどのソースからコンテンツを取得し、各アイテムの結果をリストに配置されたビューに変換するAdapter
を使用して、リストに自動的に挿入されます。
レイアウトのコンテンツが動的であるか、または事前に決定されていない場合は、 AdapterView
をサブクラス化するレイアウトを使用して、実行時にビューをレイアウトにAdapterView
ことができます。 AdapterView
クラスのサブクラスは、 Adapter
を使用してレイアウトにデータをバインドします。
ListView
を使用する前に、 RecyclerView
例もチェックする必要があります。
CursorAdapterを使用したフィルタリング
// Get the reference to your ListView
ListView listResults = (ListView) findViewById(R.id.listResults);
// Set its adapter
listResults.setAdapter(adapter);
// Enable filtering in ListView
listResults.setTextFilterEnabled(true);
// Prepare your adapter for filtering
adapter.setFilterQueryProvider(new FilterQueryProvider() {
@Override
public Cursor runQuery(CharSequence constraint) {
// in real life, do something more secure than concatenation
// but it will depend on your schema
// This is the query that will run on filtering
String query = "SELECT _ID as _id, name FROM MYTABLE "
+ "where name like '%" + constraint + "%' "
+ "ORDER BY NAME ASC";
return db.rawQuery(query, null);
}
});
たとえば、ユーザーがEditText
入力するたびにクエリが実行されるとします。
EditText queryText = (EditText) findViewById(R.id.textQuery);
queryText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
// This is the filter in action
adapter.getFilter().filter(s.toString());
// Don't forget to notify the adapter
adapter.notifyDataSetChanged();
}
@Override
public void afterTextChanged(final Editable s) {
}
});
カスタムArrayAdapter
デフォルトでは、ArrayAdapterクラスは各項目のtoString()
を呼び出し、その内容をTextViewに配置することによって、各項目の表示を作成します。
各項目の複雑なビューを作成するには(ArrayAdapterクラスを拡張してgetView getView()
メソッドをオーバーライドし、各項目に必要なViewのタイプを返すgetView()
。
例えば:
public class MyAdapter extends ArrayAdapter<YourClassData>{
private LayoutInflater inflater;
public MyAdapter (Context context, List<YourClassData> data){
super(context, 0, data);
inflater = LayoutInflater.from(context);
}
@Override
public long getItemId(int position)
{
//It is just an example
YourClassData data = (YourClassData) getItem(position);
return data.ID;
}
@Override
public View getView(int position, View view, ViewGroup parent)
{
ViewHolder viewHolder;
if (view == null) {
view = inflater.inflate(R.layout.custom_row_layout_design, null);
// Do some initialization
//Retrieve the view on the item layout and set the value.
viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) view.getTag();
}
//Retrieve your object
YourClassData data = (YourClassData) getItem(position);
viewHolder.txt.setTypeface(m_Font);
viewHolder.txt.setText(data.text);
viewHolder.img.setImageBitmap(BitmapFactory.decodeFile(data.imageAddr));
return view;
}
private class ViewHolder
{
private final TextView txt;
private final ImageView img;
private ViewHolder(View view)
{
txt = (TextView) view.findViewById(R.id.txt);
img = (ImageView) view.findViewById(R.id.img);
}
}
}
ArrayAdapterを使用した基本的なListView
デフォルトでは、 ArrayAdapter
は、各項目のtoString()
を呼び出し、その内容をTextView
配置することによって、各配列項目のビューを作成します。
例:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
ここで、 android.R.layout.simple_list_item_1
は、配列内の各文字列のTextView
を含むレイアウトTextView
。
次に、 ListView
setAdapter()
を呼び出します。
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
たとえば、ImageViewsなどの配列表示用にTextViews以外のものを使用する場合、またはtoString()
以外のデータをいくつか使用してビューを満たす場合はgetView(int, View, ViewGroup)
をオーバーライドしてgetView(int, View, ViewGroup)
のタイプを返します。 この例を確認してください 。