サーチ…


前書き

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)のタイプを返します。 この例を確認してください



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow