web-gelistirme-sc.com

Android.R.layout.simple_list_item_1 ve Android.R.layout.simple_list_item_2 arasındaki fark nedir

Android'de Android.R.layout.simple_list_item_1 ve Android.R.layout.simple_list_item_2 öğelerini Android'de açıklayabilir.

Android.R.layout.simple_list_item_1 ve Android.R.layout.simple_list_item_2 öğelerinin Android içerisinde tanımlanmış düzen olduğunu biliyorum.

android.R.layout.simple_list_item_1 uygulamasında yalnızca bir metin görünümü var, ancak Android.R.layout.simple_list_item_2 iki metin görünümü içeriyor.

android.R.layout.simple_list_item_2 ... 'in listeden adaptörle birlikte nasıl iki metin gösterileceğini görmek istiyorum.

benim kodum 

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);
    }
}
22
App Kart

Aradaki fark şu. simple_list_item_1 sadece bir TextView içerir, oysa simple_list_item_2, RelativeLayout alt sınıfında iki tane içerir. Bunların ikisi de Jelly Bean'den alınmıştır.

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 belgelerine göre :

Varsayılan olarak bu sınıf, sağlanan kaynak kimliği referanslarının beklemesini beklemektedir. tek bir TextView.

Bu nedenle, varsayılan olarak, bir ArrayAdapter, birden çok TextView örneğini otomatik olarak doldurmaz. Bununla birlikte, getView() yöntemini geçersiz kılabilir ve R.layout.simple_list_item_2 içinde görünen iki TextViews dosyasını doldurabilirsiniz.

14
wsanville

Bunu, sorunuza en basit cevap olarak buldum:

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

Farketmediyseniz: püf noktası ArrayAdapter'a Android.R.id.text1 as (prensip olarak gereksiz) parametresini sağlamaktır, aksi takdirde super öğesine yapılan çağrı bir istisnaya neden olur.

Ayrıca, bu çözüm bir Inflater dosyasına ihtiyaç duymaz veya API 17'de kullanımdan kaldırılmış TwoLineListItem değerini kullanmaz.

13
winne2

Sizin de fark ettiğiniz gibi, layout_1 bir textView'a sahip ve varsayılanı kullanılacak olan . Layout_2 iki metin görünümüne sahip, diğeri ise bir alt metin olarak kullanılıyor.

ama işte hile - tüm adaptörler alt metinden birini kullanmaz;)

Herhangi bir şey ve her şey için amaca uygun özel bir adaptör yazmayı daha kolay buldum (zorunlu demeyeceğim).

Mesela, işte bir isim gösterecek özel bir adaptör ve bu simple_list_item_2 kullanarak durumu

Bu OLMAYACAKTIR kod kopyala/yapıştır ol, ancak birkaç ayarla düzeltebilirsin ...

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

Bu yüzden kurucuyu, alt metinleri içeren ek bir ArrayList ile genişletmenizi ve ardından buddy.getMood () çağrısı yerine em kullanmanızı öneririm.

Son olarak, bu bağdaştırıcıyı başlat ve listView'ın bağdaştırıcısı olarak ayarla. Voila, her iki metnin de görünmesi;

Daha fazla ayrıntılandırma için, bunun gibi iki textView içeren kendi XML dosyanızı oluşturun.

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

ve yerine

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

yap

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

İşte, şimdi adaptörlerin özel XML'ler ve listView'ler ile nasıl çalışacağını biliyorsunuz.

4
Shark

mesajlar - bir List<Map<String, String>>, başlık ve veridir - haritanın anahtarlarıdır.

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

Tek ihtiyacın olan bu.

2
P-A

Bir ArrayAdapter, her satırda yalnızca bir TextView ile nasıl başa çıkılacağını bilir. ArrayAdapter'ı alt sınıflandırarak ve getView() yöntemini geçersiz kılarak kendisiyle daha fazla uğraşmak istiyorsanız, kendinizle ilgilenmeniz gerekir.

Dizinizi nasıl oluşturduğunuza bağlı olarak, başka bir cevap daha olabilir. 

Dizi bir DB'den oluşturuluyorsa (kodlanmış bir dize dizisini gösterirsiniz, ancak bu bildiğim kadarıyla örneğin olabilir) ve diziyi başka bir faktörle sınırlandırmamışsanız, kullanmayı düşünebilirsiniz. Bağdaştırıcıyı alt sınıfa ayırmak zorunda kalmadan zaten birden fazla TextView ile başa çıkmak için ayarlanmış olan bir CursorAdapter; DB verisini bir diziye dönüştürmenin işlem gücünü koruyacaktır.

1
Barak

Bunu da programlı bir şekilde temel bir madde kullanarak yaptım:

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

bu eylemi ana etkinliğimde dikey bir doğrusal mizanpaja ekleyerek

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

İçeriklerini değiştiren öğeleri ekleyen bu etkinlik içindeki kod:

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 toplayıcı düzeni ve itemId ise dikey doğrusal düzenine eklenen temel öğedir.

Umarım bu yardımcı olabilir.

0
sataniccrow