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

任何人都可以在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中只包含一个textview,而android.R.layout.simple_list_item_2包含两个文本视图。

我想为android.R.layout.simple_list_item_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); } } 

Solutions Collecting From Web of "android.R.layout.simple_list_item_1和android.R.layout.simple_list_item_2有什么区别"

不同之处在于以下几点。 simple_list_item_1只包含一个TextView ,而simple_list_item_2RelativeLayout一个子类中有两个。 这些都是从果冻豆。

simple_list_item_1pipe理

 <?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()方法并填充出现在R.layout.simple_list_item_2中的两个TextView

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

 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的调用将导致exception。

此外,此解决scheme不需要TwoLineListItem或使用API​​ 17中已弃用的TwoLineListItem

就像你注意到的那样,layout_1有一个textView,它是默认使用的。 layout_2有两个文本视图 – 另一个用作子文本。

但这里有个诀窍 – 并不是所有的适配器都使用这个子文本;)

我发现它更容易(不会说强制性)写任何东西的一个特制的定制适配器…

例如,以下是一个自定义适配器,它将使用这个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; } 

所以我build议你扩展构造函数,其中包含子文本的附加ArrayList,然后使用em而不是buddy.getMood()调用。

最后,实例化这个适配器并将其设置为listView的适配器。 瞧,你已经有两个文本显示;)

为了进一步改进,使你自己的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和listViews一起工作。

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

这就是你所需要的。

ArrayAdapter只知道如何处理每行一个TextView。 如果你想要处理更多,你需要通过inheritanceArrayAdapter并重写getView()方法来处理这个问题。

根据你如何创build你的数组,也可能有另一个答案。

如果数组是从数据库创build的(显示硬编码的string数组,但就我所知,这可能只是您的示例),并且您没有受到其他因素的限制,可以考虑使用一个CursorAdapter,因为它们已经被设置为处理多个TextView,而不需要对适配器进行子类化,并且可以节省将DB数据转换为数组的处理能力。

我已经通过编程使用一个基本的项目来完成这个工作:

 <?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是添加到垂直线性布局的基本项目。

希望这可以帮助。