android.R.layout.simple_list_item_1 和 android.R.layout.simple_list_item_2 有什么区别

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11722885/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 08:35:49  来源:igfitidea点击:

What is difference between android.R.layout.simple_list_item_1 and android.R.layout.simple_list_item_2

android

提问by App Kart

Can anyone explain android.R.layout.simple_list_item_1 and android.R.layout.simple_list_item_2 in arrayadapter in android.

谁能解释android.R.layout.simple_list_item_1和android.R.layout.simple_list_item_2中的arrayadapter。

I know in android.R.layout.simple_list_item_1 and android.R.layout.simple_list_item_2 are layout which is define in android itself.

我知道在 android.R.layout.simple_list_item_1 和 android.R.layout.simple_list_item_2 是在 android 中定义的布局。

in android.R.layout.simple_list_item_1 only contain only one textview but android.R.layout.simple_list_item_2 contain two text view.

在 android.R.layout.simple_list_item_1 只包含一个 textview 而 android.R.layout.simple_list_item_2 包含两个文本视图。

i want to example for android.R.layout.simple_list_item_2 ...how to show two text view in listview with adapter.

我想以 android.R.layout.simple_list_item_2 为例......如何在带有适配器的列表视图中显示两个文本视图。

my code is

我的代码是

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);
    }
}

采纳答案by wsanville

The difference is the following. simple_list_item_1contains only a TextView, whereas simple_list_item_2has two inside a subclass of RelativeLayout. These are both taken from Jelly Bean.

区别如下。simple_list_item_1只包含一个TextView,而simple_list_item_2在 的子类中有两个RelativeLayout。这些都取自果冻豆。

simple_list_item_1

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

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>

According to the docs for ArrayAdapter:

根据ArrayAdapter文档

By default this class expects that the provided resource id references a single TextView.

默认情况下,此类期望提供的资源 ID 引用单个 TextView。

So by default, an ArrayAdapterdoesn't automatically fill in multiple TextViewinstances. You can, however, override the getView()method and fill in the two TextViews that appear in R.layout.simple_list_item_2

所以默认情况下, anArrayAdapter不会自动填充多个TextView实例。但是,您可以覆盖该getView()方法并填写TextView出现在R.layout.simple_list_item_2

回答by winne2

I found this to be the simplest answer to your question:

我发现这是您问题的最简单答案:

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;
  }
};

If you didn't notice: the trick is to supply android.R.id.text1as (principally unneccessary) parameter to ArrayAdapter, otherwise the call to superwill cause an exception.

如果您没有注意到:诀窍是将android.R.id.text1作为(主要是不必要的)参数提供给 ArrayAdapter,否则调用super将导致异常。

Also, this solution does not need an Inflateror make use of TwoLineListItem, which was deprecated in API 17.

此外,此解决方案不需要Inflater或使用TwoLineListItemAPI 17 中已弃用的 。

回答by Shark

Like you noticed, layout_1 has one textView and it's the default one to be used. layout_2 has two text views - the other one used as a subtext.

正如您所注意到的,layout_1 有一个 textView,它是默认使用的。layout_2 有两个文本视图——另一个用作潜台词。

but here's the trick - not all adapters make use of the subtext one ;)

但这是诀窍 - 并非所有适配器都使用潜台词 ;)

I found it easier (not gonna say mandatory) to write a purpose-built custom adapter for anything and everything...

我发现为任何东西编写一个专门构建的自定义适配器更容易(不是强制性的)......

For instance, here's a custom adapter that will display a name and it's status using this simple_list_item_2

例如,这是一个自定义适配器,它将使用这个 simple_list_item_2 显示名称和状态

This WILL NOTbe copy/paste code, but you'll fix it with a few tweaks...

不会是复制/粘贴代码,但您可以通过一些调整来修复它...

 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;
}

So i propose you expand the constructor with an additional ArrayList which contains the subtexts and then use em instead of the buddy.getMood() call.

因此,我建议您使用包含子文本的附加 ArrayList 扩展构造函数,然后使用 em 而不是 buddy.getMood() 调用。

Finally, instantiate this adapter and set it as the listView's adapter. Voila, you've got both texts showing up ;)

最后,实例化这个适配器并将其设置为 listView 的适配器。瞧,你的两个文本都出现了 ;)

For further refinement, make your own XML file containing two textViews, like this.

为了进一步细化,制作您自己的包含两个 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" />

and instead of

而不是

  row = inflater.inflate(R.layout.simple_list_item_2, parent, false);

do

 row = inflater.inflate(R.layout.buddy_list_item, parent, false);

There you go, now you know how to make adapters work with custom XMLs and listViews.

好了,现在您知道如何使适配器与自定义 XML 和列表视图一起工作了。

回答by P-A

messages - is a List<Map<String, String>>, title and data - is keys of map.

消息 - 是一个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);

Thats all you need.

这就是你所需要的。

回答by Barak

An ArrayAdapter only knows how to deal with one TextView per row. If you want it to deal with more you need to deal with that yourself by subclassing ArrayAdapter and overriding the getView()method.

ArrayAdapter 只知道如何处理每行一个 TextView。如果您希望它处理更多,则需要通过子类化 ArrayAdapter 并覆盖该getView()方法来自己处理。

Depending on how you are creating your array, there may be another answer as well.

根据您创建阵列的方式,可能还有另一个答案。

If the array is being created from a DB (you show a hard-coded string array, but that might just be for your example as far as I know) and you are not constrained to the array by some other factor, you might consider using a CursorAdapter as they are already set up to deal with multiple TextViews without having to subclass the adapter, and it would save you the processing power of turning DB data into an array.

如果数组是从数据库创建的(您显示了一个硬编码的字符串数组,但据我所知,这可能只是您的示例)并且您不受其他一些因素的限制,您可以考虑使用一个 CursorAdapter,因为它们已经被设置为处理多个 TextViews 而无需子类化适配器,它可以节省将 DB 数据转换为数组的处理能力。

回答by sataniccrow

I've done this also programmatically using a basic item:

我也使用基本项目以编程方式完成了此操作:

<?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>

by adding this layer to a vertical linear layout in my main activity

通过将此图层添加到我的主要活动中的垂直线性布局

...
<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>
...

The code inside tha activity which adds the items modifying their content is:

添加修改其内容的项目的 tha 活动中的代码是:

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());

        }

    } 

where rootId is the collector layout and itemId is the basic item added to the vertical linear layout.

其中 rootId 是收集器布局,itemId 是添加到垂直线性布局的基本项目。

Hope this can help.

希望这能有所帮助。