Listeye öğe ekleme Android'de dinamik olarak görüntüleme


326

Herkes android listView oluşturmak için bir öğretici açıklayabilir veya önerebilir?

İşte benim gereksinimleri:

  • Bir düğmeye basarak dinamik olarak yeni öğeler ekleyebilmeliyim.
  • Anlamak için yeterince basit olmalıdır (örneğin, herhangi bir performans iyileştirmesi veya dönüşüm görüntüleme olmadan)

StackOverflow üzerinde yayınlanan, bu konuda oldukça birkaç soru olduğunu biliyorum, ama soruma cevap verecek herhangi bir bulamadık. Teşekkürler!


3
Şu anda Shardul'un en çok oy alan cevabı yüksek kalite olarak kabul ediliyor ve kullanıcılar kabul edilmesi gerektiğini düşündüklerini belirtti. Kabul etmeyi düşünebilir misiniz?
Matt Welke

Yanıtlar:


583

İlk olarak projenizin res/layout/main.xmlklasöründe bir XML düzeni oluşturun :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <Button
        android:id="@+id/addBtn"
        android:text="Add New Item"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="addItems"/>
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false"
    />
</LinearLayout>

Bu, üstte bir düğme ve altta bir liste görünümü olan basit bir düzendir. Not o ListViewkimliğvar @android:id/listvarsayılan tanımlayan ListViewbir ListActivitykullanabilir.

public class ListViewDemo extends ListActivity {
    //LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS
    ArrayList<String> listItems=new ArrayList<String>();

    //DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW
    ArrayAdapter<String> adapter;

    //RECORDING HOW MANY TIMES THE BUTTON HAS BEEN CLICKED
    int clickCounter=0;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        adapter=new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1,
            listItems);
        setListAdapter(adapter);
    }

    //METHOD WHICH WILL HANDLE DYNAMIC INSERTION
    public void addItems(View v) {
        listItems.add("Clicked : "+clickCounter++);
        adapter.notifyDataSetChanged();
    }
}

android.R.layout.simple_list_item_1 Android tarafından sağlanan varsayılan liste öğesi düzenidir ve bu stok düzenini karmaşık olmayan şeyler için kullanabilirsiniz.

listItemsListView'da gösterilen verileri tutan bir Liste'dir. Tüm yerleştirme ve çıkarma işlemleri listItems; içindeki değişiklikler listItemsgörünüme yansıtılmalıdır. Tarafından Yani işlenir oldu ArrayAdapter<String> adapterkullanılarak haberdar edilmesi gereken,:

adapter.notifyDataSetChanged();

Bir Adaptörü 3 parametre ile başlatılır: bağlamda, senin olabilir activity/listactivity; bireysel liste öğenizin düzeni; ve son olarak, listede görüntülenecek gerçek veriler olan liste.


2
ListView burada faaliyetimize nasıl eklendiğini anlamıyorum.
Breedly

7
@Breedly Çünkü bir ListView ile bir düzeni olan bir Etkinlik değil, bir ListActivity . Kimliğin görünümünü bulmanıza gerek yoktur. Olarak, Referans okuyabilirsiniz: . Bu nedenle, varsayılan olarak yöntemler ( setAdapter vb.) Sınıfın içinde " içeridir ". ListActivity is an activity that includes a ListView as its only layout element by default. [...] (it) hosts a ListView object
fllo

Doğru cevap alındığında mutluluğu gösterelim: /
support_ms

1
ArrayList'teki öğe Internet'ten yükleme gibi daha karmaşıksa ve her öğe resim videosu ve bunun gibi bir şey içeriyorsa, bu yaklaşım performansla karşılaşır mı?
zionpi

1
Bunu bir parça halinde nasıl uygulayabilirim?
Oamar Kanji

64

onun yerine

listItems.add("New Item");
adapter.notifyDataSetChanged();

doğrudan arayabilirsin

adapter.add("New Item");

@gumuruh bağdaştırıcının kendisi değiştirilebilir, böylece notifyDatasetChanged () öğesini çağıracak ve listView öğesini otomatik olarak getView () yöntemini çağıracak nesneleri doğrudan ekleyebilir veya kaldırabiliriz. Bu ekstra kod satırını azaltır.
venkat530

adaptöre ekleyerek otomatik olarak notifyDatasetChanged () çağırın? Ah anlıyorum. Teşekkürler @ venkat530. Peki ya listenin kendisi? Diyelim ki öncelikle adaptör için veri kabı olarak kullanılan bir arraylist yarattı. Ve şimdi sadece arraylist yerine adaptöre bir öğe ekliyorsunuz. Arraylist verileri güncellenir / dokunulmaz mı?
Gumuruh

1
@gumuruh ikinci en iyi uygulamadır çünkü senkronize edilir.
Ricardo

1
@ gumuruh ve cursory deneme ve ArrayAdapter kaynak kodu [ github.com/android/platform_frameworks_base/blob/master/core/… , temel veri kümesi de değiştirilmiş gibi görünüyor.
CCJ

Shardul'un cevabını çalıştırdım, sonra kırdım ve nasıl onaracağımı anlayamadım. Bir hevesle, ben bunu denemek düşündüm ve voila, tekrar çalışıyor! Çok teşekkür ederim! Yine de, nasıl ya da neden düzelttiği hakkında hiçbir fikrim yok. Herhangi bir fikir?
donutguy640

55

Öncelikle activity_main.xml dosyasına bir ListView, bir EditText ve bir düğme eklemelisiniz.

Şimdi, ActivityMain'inizde:

private EditText editTxt;
private Button btn;
private ListView list;
private ArrayAdapter<String> adapter;
private ArrayList<String> arrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editTxt = (EditText) findViewById(R.id.editText);
    btn = (Button) findViewById(R.id.button);
    list = (ListView) findViewById(R.id.listView);
    arrayList = new ArrayList<String>();

    // Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown),
    // and the array that contains the data
    adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, arrayList);

    // Here, you set the data in your ListView
    list.setAdapter(adapter);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            // this line adds the data of your EditText and puts in your array
            arrayList.add(editTxt.getText().toString());
            // next thing you have to do is check if your adapter has changed
            adapter.notifyDataSetChanged();
        }
    });
}

Bu benim için çalışıyor, umarım sana yardımcı oldum


4
Çok iyi bir açıklama ve özellikle herkesin örneklerinde sihirli bir şekilde görünen adaptör öğesini açıkladığınız için teşekkürler. :)
raddevus

1
Bunun için bulduğum en iyi örnek :)
Dinuka Salwathura

Bu cevap kişinin ne istediğini tatmin etti. Karmaşık iyileştirmeler olmadan basit ve temiz. En iyi cevap aslında sadece büyük ustaların bildiği ListActivity'yi tanıtıyor. Şimdi tek sorunum listede görünümlere çizilebilir şeyler ve şeyler nasıl ekleyeceğim. Bana öyle geliyor ki sadece ipler ekliyorum.

Bağdaştırıcı'da adsız Liste nesnesi oluşturmak, liste nesnesine 16 bit işaretçi oluşturmaktan daha iyi bir optimizasyon olabilir. Bağdaştırıcı bir ekleme yöntemi olduğundan, bağdaştırıcı oluşturulduktan sonra gerekli değildir.

17

ListView ListActivity yerine AppCompatActivity'de olmasını istiyorsanız, aşağıdakileri yapabilirsiniz (@ Shardul'un cevabını değiştirme):

public class ListViewDemoActivity extends AppCompatActivity {
    //LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS
    ArrayList<String> listItems=new ArrayList<String>();

    //DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW
    ArrayAdapter<String> adapter;

    //RECORDING HOW MANY TIMES THE BUTTON HAS BEEN CLICKED
    int clickCounter=0;
    private ListView mListView;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.activity_list_view_demo);

        if (mListView == null) {
            mListView = (ListView) findViewById(R.id.listDemo);
        }

        adapter=new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                listItems);
        setListAdapter(adapter);
    }

    //METHOD WHICH WILL HANDLE DYNAMIC INSERTION
    public void addItems(View v) {
        listItems.add("Clicked : "+clickCounter++);
        adapter.notifyDataSetChanged();
    }

    protected ListView getListView() {
        if (mListView == null) {
            mListView = (ListView) findViewById(R.id.listDemo);
        }
        return mListView;
    }

    protected void setListAdapter(ListAdapter adapter) {
        getListView().setAdapter(adapter);
    }

    protected ListAdapter getListAdapter() {
        ListAdapter adapter = getListView().getAdapter();
        if (adapter instanceof HeaderViewListAdapter) {
            return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
        } else {
            return adapter;
        }
    }
}

Ve düzeninizde kullanmak yerine android:id="@android:id/list"kullanabilirsinizandroid:id="@+id/listDemo"

Şimdi ListViewnormal bir içiniz olabilir AppCompatActivity.


13

MainActivity.java dosyasının kodu.

public class MainActivity extends Activity {

    ListView listview;
    Button Addbutton;
    EditText GetValue;
    String[] ListElements = new String[] {
        "Android",
        "PHP"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listview = (ListView) findViewById(R.id.listView1);
        Addbutton = (Button) findViewById(R.id.button1);
        GetValue = (EditText) findViewById(R.id.editText1);

        final List < String > ListElementsArrayList = new ArrayList < String >
            (Arrays.asList(ListElements));


        final ArrayAdapter < String > adapter = new ArrayAdapter < String >
            (MainActivity.this, android.R.layout.simple_list_item_1,
                ListElementsArrayList);

        listview.setAdapter(adapter);

        Addbutton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                ListElementsArrayList.add(GetValue.getText().toString());
                adapter.notifyDataSetChanged();
            }
        });
    }
}

Activity_main.xml mizanpaj dosyasının kodu.

<RelativeLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.listviewaddelementsdynamically_android_examples
    .com.MainActivity" >

  <Button
    android:id="@+id/button1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editText1"
    android:layout_centerHorizontal="true"
    android:text="ADD Values to listview" />

  <EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="26dp"
    android:ems="10"
    android:hint="Add elements listView" />

  <ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/button1"
    android:layout_centerHorizontal="true" >
  </ListView>

</RelativeLayout>

ScreenShot

resim açıklamasını buraya girin


0

Kısa cevap: Bir ListView oluşturduğunuzda, ona verilere bir referans iletirsiniz. Şimdi, bu veriler her değiştiğinde, adaptör.notifyDataSetChanged (); öğesini çağırdıktan sonra liste görünümünü etkiler ve böylece öğeyi ona ekler.

RecyclerView kullanıyorsanız, hafızayı kaydetmek için yalnızca son öğeyi (objeler listesinin sonuna eklediyseniz) güncelleyin: mAdapter.notifyItemInserted (mItems.size () - 1);


0

Listview android kotlin'de dinamik olarak veri eklemek için basit bir cevap

class MainActivity : AppCompatActivity(){

    var listItems = arrayListOf<String>()
    val array = arrayOf("a","b","c","d","e")
    var listView: ListView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.scrollview_layout)

        listItems.add("a")
        listItems.add("b")
        listItems.add("c")
        listItems.add("d")
        listItems.add("e")

        //if you want to add array items to a list you can try this for each loop
        for(items in array)
            listItems.add(items)
        Log.e("TAG","listItems array: $listItems")

    }
}

Burada sadece iki yolu açıkladım, bunu birçok şekilde yapabiliriz.


ListView'a eklediğiniz kısım nerede?
Onie Maniego

@OnieManiego burada iki şekilde listview öğeleri ekledim, yukarıdaki 1 görebilirsiniz. ListItems.add ("a") listItems.add ("b") listItems.add ("c") listItems.add ("d ") listItems.add (" e ") bu ilk eklediğim yol 2'dir. (dizi içindeki öğeler) listItems.add (öğeler) ikinci şekilde dizi
sirajudheen tk

@OnieManiego umarım u anlarsınız, eğer size yardımcı olursa pls upvote
sirajudheen tk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.