お気づきのように、layout_1にはtextViewが1つあり、これがデフォルトで使用されます。layout_2には2つのテキストビューがあります。もう1つはサブテキストとして使用されます。
しかし、ここに秘訣があります-すべてのアダプターがサブテキストを使用するわけではありません;)
あらゆるものに対応する専用のカスタムアダプタを作成する方が簡単であることがわかりました(必須とは言えません)...
たとえば、このsimple_list_item_2を使用して名前とステータスを表示するカスタムアダプタを次に示します。
これはコードのコピー/貼り付けにはなりませんが、いくつかの調整を加えることで修正できます...
public class BuddyArrayAdapter extends ArrayAdapter<Buddy>
{
private static final String tag = "BuddyArrayAdapter";
private Context context;
private TextView buddyName;
private TextView buddyStatus;
private List<Buddy> buddies = new ArrayList<Buddy>();
/**
* The default constructor which is invoked to create the buddy array
* adapter.
* <p>
* The adapter is needed to 'translate' data into a viewable item / widget.
*
* @param context
* the application context
* @param objects
* the backing array populated by Buddy objects to be displayed.
* @see {@link ArrayAdapter}<T>
*/
public BuddyArrayAdapter(Context context, int textViewResourceId, List<Buddy> objects)
{
super(context, textViewResourceId, objects);
this.context = context;
this.buddies = objects;
Collections.sort(buddies);
}
/**
* The method used for determining how many views are in this list or in
* other words, how many views are managed by this adapter.
*
* @return the number of items this adapter controls.
*/
@Override
public int getCount()
{
return this.buddies.size();
}
/**
* Get the data item associated with the specified position in the data set.
*
* @param index
* Position of the item whose data we want within the adapter's
* data set.
* @return the Buddy object data at the specified position.
*/
@Override
public Buddy getItem(int index)
{
if (index <= getCount()) //IndexOutOfBoundsException fix
return this.buddies.get(index);
return this.buddies.get(getCount() - 1);
}
/**
* Get a View that displays the data at the specified position in the data
* set. You can either create a View manually or inflate it from an XML
* layout file. When the View is inflated, the parent View (GridView,
* ListView...) will apply default layout parameters unless you use
* inflate(int, android.view.ViewGroup, boolean) to specify a root view and
* to prevent attachment to the root.
* <p>
* This method is used to generate views to be used in the ListView. This
* the method that defines how data will look and be represented throughout
* the UI.
*
* @param position
* The position of the item that is being placed / The position
* of the item within the adapter's data set of the item whose
* view we want.
* <p>
* @param convertView
* The old view to reuse, if possible. Note: You should check
* that this view is non-null and of an appropriate type before
* using. If it is not possible to convert this view to display
* the correct data, this method can create a new view.
* Heterogeneous lists can specify their number of view types, so
* that this View is always of the right type (see
* getViewTypeCount() and getItemViewType(int))
* <p>
* @param parent
* The parent that this view will eventually be attached to.
* @return the view that defines how this Buddy object is represented in the
* ListView / A View corresponding to the data at the specified
* position.
*
* @see {@link BaseAdapter#getView(int, View, ViewGroup)}
*/
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
if (row == null)
{
// ROW INFLATION
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.simple_list_item_2, parent, false);
}
// Get item
Buddy buddy = getItem(position);
buddy.refresh();
buddyName = (TextView) row.findViewById(R.id.buddy_name); //change this to textField1 from simple_list_item_2
buddyName.setText(buddy.toString());
buddyStatus = (TextView) row.findViewById(R.id.buddy_mood); //change this to textField2 from simple_list_item_2
buddyStatus.setText(buddy.getMood());
// Log.d(tag, buddy.getIdentity()+"'s mood is "+buddyStatus.getText());
return row;
}
したがって、サブテキストを含む追加のArrayListを使用してコンストラクターを展開し、buddy.getMood()呼び出しの代わりにemを使用することを提案します。
最後に、このアダプターをインスタンス化し、listViewのアダプターとして設定します。出来上がり、両方のテキストが表示されます;)
さらに改良するには、次のように2つのtextViewを含む独自のXMLファイルを作成します。
<?xml version="1.0" encoding="utf-8"?>
<com.skype.widget.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<CheckedTextView
android:id="@+id/buddy_name"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:checkMark="?android:attr/textCheckMark"
android:gravity="center_vertical"
android:paddingLeft="6dip"
android:paddingRight="6dip"
android:text="@string/buddy_name"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/buddy_mood"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/empty_string"
android:layout_marginLeft="-350dp"
android:layout_marginTop="16dp"
android:gravity="center_vertical|bottom"
android:textAppearance="?android:attr/textAppearanceSmall" />
の代わりに
row = inflater.inflate(R.layout.simple_list_item_2, parent, false);
行う
row = inflater.inflate(R.layout.buddy_list_item, parent, false);
これで、アダプターをカスタムXMLおよびlistViewで機能させる方法がわかりました。