26

誰もがandroidのarrayadapterでandroid.R.layout.simple_list_item_1とandroid.R.layout.simple_list_item_2を説明できますか?

android.R.layout.simple_list_item_1とandroid.R.layout.simple_list_item_2は、android自体で定義されているレイアウトです。

android.R.layout.simple_list_item_1には1つのテキストビューしか含まれていませんが、android.R.layout.simple_list_item_2には2つのテキストビューが含まれています。

android.R.layout.simple_list_item_2の例を示したい...アダプターを使用してリストビューに2つのテキストビューを表示する方法。

私のコードは

package com.app.listview;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class ExampleListViewActivity extends Activity {

    private String[] nameArr = new String[]{"Arun","Anil","Ankit","Manoj"};
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ListView listView =  (ListView)findViewById(R.id.lv);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                                                                android.R.layout.simple_list_item_1,
                                                                android.R.id.text1,
                                                                nameArr);
        listView.setAdapter(adapter);
    }
}
4

6 に答える 6

15

違いは次のとおりです。simple_list_item_1のみが含まれますが、のサブクラス内には2つありTextViewます。これらは両方ともジェリービーンズから取られています。simple_list_item_2RelativeLayout

simple_list_item_1

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>

simple_list_item_2

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<TwoLineListItem xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:mode="twoLine"
>

    <TextView android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
    android:layout_marginLeft="?android:attr/listPreferredItemPaddingLeft"
    android:layout_marginTop="8dip"
        android:textAppearance="?android:attr/textAppearanceListItem"
    />

    <TextView android:id="@android:id/text2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@android:id/text1"
    android:layout_alignLeft="@android:id/text1"
        android:textAppearance="?android:attr/textAppearanceSmall"
    />

</TwoLineListItem>

ArrayAdapterのドキュメントによると:

デフォルトでは、このクラスは、提供されたリソースIDが単一のTextViewを参照することを想定しています。

したがって、デフォルトでは、は複数のインスタンスArrayAdapterを自動的に入力しません。TextViewただし、getView()メソッドをオーバーライドしてTextView、に表示される2つのを入力することはできます。R.layout.simple_list_item_2

于 2012-07-30T13:59:30.717 に答える
15

私はこれがあなたの質問に対する最も簡単な答えであることがわかりました:

ArrayAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_2, android.R.id.text1, list) {
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    TextView text1 = (TextView) view.findViewById(android.R.id.text1);
    TextView text2 = (TextView) view.findViewById(android.R.id.text2);

    text1.setText(person[position].getName());
    text2.setText(person[position].getAge());
    return view;
  }
};

気づかなかった場合:トリックはandroid.R.id.text1、(主に不要な)パラメーターとしてArrayAdapterに提供することです。そうしないと、を呼び出すとsuper例外が発生します。

また、このソリューションでは、API 17で非推奨となった、Inflaterまたはを使用する必要はありません。TwoLineListItem

于 2013-08-30T10:00:49.753 に答える
4

お気づきのように、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で機能させる方法がわかりました。

于 2012-07-30T13:59:01.747 に答える
2

メッセージ-はList<Map<String, String>>、タイトルとデータ-はマップのキーです。

SimpleAdapter adapter = new SimpleAdapter(this, messages,
            android.R.layout.simple_list_item_2,
            new String[] {"title", "data"},
            new int[] {android.R.id.text1,
        android.R.id.text2,
    });
list.setAdapter(adapter);

必要なのはそれだけです。

于 2015-05-31T10:45:31.700 に答える
1

ArrayAdapterは、行ごとに1つのTextViewを処理する方法しか知りません。もっと処理したい場合は、ArrayAdapterをサブクラス化し、getView()メソッドをオーバーライドして、自分で処理する必要があります。

アレイの作成方法によっては、別の答えもあるかもしれません。

配列がDBから作成されており(ハードコードされた文字列配列を示していますが、これは私の知る限りの例にすぎない可能性があります)、他の要因によって配列に制約されていない場合は、次の使用を検討してください。 CursorAdapterは、アダプターをサブクラス化することなく複数のTextViewを処理するように既に設定されているため、DBデータを配列に変換する処理能力を節約できます。

于 2012-07-30T14:02:55.523 に答える
0

私はこれもプログラムで基本的なアイテムを使用して行いました:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginLeft="3dp"
    android:id="@+id/linearLayoutBasicItem"
     >

    <ImageView
        android:id="@+id/imageViewBasicItem"
        android:layout_marginTop="3dp"
        android:layout_width="80dp"
        android:layout_height="100dp"
        android:src="@drawable/blockbreaker3"
        android:background="#b3b3b3"
         />
    <RelativeLayout 
        android:id="@+id/relativeLayoutInsideBasicItem"
        android:layout_width="fill_parent"
        android:layout_marginTop="3dp"
        android:layout_height="100dp"
        android:background="#b3b3b3"
        >
        <TextView
            android:id="@+id/textViewBasicItem"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Affronta livelli ancora più complessi che ti porteranno al di là di un semplice schermo pieno di mattoncini."
            android:textSize="10dp"
            android:textColor="#000000"
            android:gravity="top"
            android:ems="10" />

        <TextView
          android:id="@+id/textViewPlatformItem"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_below="@+id/textViewBasicItem"
          android:layout_marginTop="3dp"
          android:text="Platform: "
          android:textSize="8dp"
          android:textColor="#000000"
          android:gravity="top"
          android:ems="10" />
        <TextView
          android:id="@+id/textViewTypeItem"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_below="@+id/textViewPlatformItem"
          android:layout_marginTop="3dp"
          android:text="Genere: "
          android:textSize="8dp"
          android:textColor="#000000"
          android:gravity="top"
          android:ems="10" />
        <TextView
          android:id="@+id/textViewDateItem"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_below="@+id/textViewTypeItem"
          android:layout_marginTop="3dp"
          android:text="Data di lancio: "
          android:textSize="8dp"
          android:textColor="#000000"
          android:gravity="top"
          android:ems="10"
          android:layout_marginBottom="3dp"
           />
        <TextView
          android:id="@+id/textViewPriceItem"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_alignParentBottom="true"
          android:layout_alignParentRight="true"
          android:text="Gratis    "
          android:gravity="right"
          android:textSize="15dp"
          android:textColor="#0096ff"
          android:ems="10"
           />

    </RelativeLayout>

</LinearLayout>

私の主な活動でこのレイヤーを垂直線形レイアウトに追加することによって

...
<ScrollView 
        android:id="@+id/scrollViewStep1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"        
        android:layout_below="@+id/textViewStep1"
        android:layout_marginTop="35dp"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginBottom="32dp"
        android:background="#e8e8e8"
        android:orientation="vertical" >

        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:id="@+id/collector"
            ></LinearLayout>


    </ScrollView>
...

コンテンツを変更するアイテムを追加するアクティビティ内のコードは次のとおりです。

public void listViewTailer(int rootId, int itemId){

        LinearLayout collector = (LinearLayout) findViewById(rootId);    
        LinearLayout inflatedView;


        for(int i = 0; i < listFeeder.size(); i++){


            inflatedView = (LinearLayout) View.inflate(this, itemId, null);
            TextView description = (TextView) inflatedView.findViewById(id.textViewBasicItem);
            description.setText(listFeeder.getGameList().get(i).getPrdDescription());
            TextView platform = (TextView) inflatedView.findViewById(id.textViewPlatformItem);
            platform.setText(platform.getText() + "" + listFeeder.getGameList().get(i).getPrdPlatform());
            TextView type = (TextView) inflatedView.findViewById(id.textViewTypeItem);
            type.setText(type.getText() + "" + listFeeder.getGameList().get(i).getPrdType());
            TextView date = (TextView) inflatedView.findViewById(id.textViewDateItem);
            date.setText(date.getText() + "" + listFeeder.getGameList().get(i).getPrdDateAvailability());
            TextView price = (TextView) inflatedView.findViewById(id.textViewPriceItem);
            price.setText(listFeeder.getGameList().get(i).getPrdPrice() + "    ");

            collector.addView(inflatedView);

          ImageView imageView = (ImageView) inflatedView.findViewById(id.imageViewBasicItem);
          imageView.setImageResource(listFeeder.getGameList().get(i).getPrdImage());

        }

    } 

ここで、rootIdはコレクターレイアウトであり、itemIdは垂直線形レイアウトに追加される基本アイテムです。

これがお役に立てば幸いです。

于 2012-07-30T14:02:44.853 に答える