Bagaimana cara menambahkan elemen ke listView secara dinamis di Android

326

Adakah yang bisa menjelaskan atau menyarankan tutorial untuk membuat listView di android?

Inilah persyaratan saya:

  • Saya harus dapat menambahkan elemen baru secara dinamis dengan menekan tombol.
  • Harus cukup sederhana untuk dipahami (mungkin tanpa peningkatan kinerja atau konversi, misalnya)

Saya tahu ada beberapa pertanyaan tentang topik ini, diposting di sini di StackOverflow, tetapi tidak dapat menemukan yang akan menjawab pertanyaan saya. Terima kasih!

user555217
sumber
3
Jawaban tertinggi saat ini dari Shardul dianggap berkualitas tinggi dan pengguna telah menyatakan mereka merasa itu harus diterima. Bisakah Anda mempertimbangkan untuk menerimanya?
Matt Welke

Jawaban:

583

Buat tata letak XML terlebih dahulu di res/layout/main.xmlfolder proyek Anda :

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

Ini adalah tata letak sederhana dengan tombol di bagian atas dan tampilan daftar di bagian bawah. Perhatikan bahwa ListViewid memiliki @android:id/listyang mendefinisikan default ListViewyang ListActivitydapat digunakan.

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 adalah tata letak item daftar default yang disediakan oleh Android, dan Anda dapat menggunakan tata letak stok ini untuk hal-hal yang tidak rumit.

listItemsadalah Daftar yang menyimpan data yang ditampilkan di ListView. Semua penyisipan dan penghapusan harus dilakukan pada listItems; perubahan listItemsharus tercermin dalam tampilan. Itu ditangani oleh ArrayAdapter<String> adapter, yang harus diberitahukan menggunakan:

adapter.notifyDataSetChanged();

Adaptor instantiated dengan 3 parameter: konteks, yang bisa menjadi milik Anda activity/listactivity; tata letak item daftar individual Anda; dan terakhir, daftar, yang merupakan data aktual yang akan ditampilkan dalam daftar.

Shardul
sumber
2
Saya tidak mengerti bagaimana ListView menempel pada aktivitas kami di sini.
Breedly
7
@ Sebelumnya Karena itu ListActivity dan bukan Kegiatan yang memiliki tata letak dengan ListView . Anda tidak perlu menemukan tampilan id. Seperti yang dapat Anda baca di Referensi: ListActivity is an activity that includes a ListView as its only layout element by default. [...] (it) hosts a ListView object. Jadi, secara default metode (seperti setAdapter , dll) adalah "di dalam" Kelas.
fllo
Mari kita tunjukkan kebahagiaan ketika jawaban yang benar didapat: /
support_ms
1
Jika elemen dalam ArrayList lebih rumit seperti memuat dari Internet dan setiap item berisi video gambar dan sesuatu seperti itu, apakah pendekatan ini akan mencapai kinerja wajah?
zionpi
1
Bagaimana saya bisa menerapkan ini dalam sebuah fragmen?
Oamar Kanji
64

dari pada

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

Anda bisa langsung menelepon

adapter.add("New Item");
venkat530
sumber
@gumuruh adaptor itu sendiri bisa berubah sehingga kita dapat langsung menambah atau menghapus objek yang akan memanggil notifyDatasetChanged () dan getView () dari listView secara otomatis. Ini mengurangi garis kode tambahan.
venkat530
jadi dengan menambahkan ke dalam adaptor secara otomatis panggil notifyDatasetChanged ()? Oh begitu. Terima kasih @ venkat530. Tetapi bagaimana dengan daftar itu sendiri? Maksud saya jika katakanlah pertama kali ia membuat daftar array yang digunakan sebagai wadah data untuk adaptor. Dan sekarang Anda hanya menambahkan item langsung ke adaptor, bukan ke daftar array. Apakah data daftar array diperbarui / tidak tersentuh?
gumuruh
1
@gumuruh yang kedua adalah praktik terbaik karena disinkronkan.
Ricardo
1
@gumuruh dari eksperimen sepintas dan kode sumber ArrayAdapter [ github.com/android/platform_frameworks_base/blob/master/core/… , sepertinya kumpulan data yang mendasarinya juga akan dimodifikasi.
CCJ
Saya membuat jawaban Shardul bekerja, kemudian memecahkannya dan tidak tahu bagaimana cara memperbaikinya. Saat itu, saya pikir saya akan mencoba ini, dan voila, itu berhasil lagi! Terima kasih banyak! Padahal, saya tidak tahu bagaimana atau mengapa memperbaikinya. Ada ide?
donutguy640
55

Pertama, Anda harus menambahkan ListView, EditText dan tombol ke activity_main.xml Anda.

Sekarang, di ActivityMain Anda:

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

Ini bekerja untuk saya, saya harap saya membantu Anda

Robert
sumber
4
Penjelasan dan terima kasih yang sangat baik terutama untuk menjelaskan item adaptor - yang tampaknya secara ajaib muncul dalam contoh orang lain. :)
raddevus
1
Ini adalah contoh terbaik yang saya temukan untuk ini :)
Dinuka Salwathura
Jawaban ini memuaskan apa yang diminta orang itu. Sederhana dan bersih tanpa perbaikan yang rumit. Jawaban teratas sebenarnya memperkenalkan ListActivity, yang hanya diketahui oleh para master besar. Satu-satunya masalah saya sekarang adalah bagaimana cara menambahkan gambar dan barang ke tampilan dalam daftar. Menurut saya, saya hanya menambahkan string.
Optimasi mungkin untuk membuat objek Daftar yang tidak disebutkan namanya dalam Adaptor daripada membuat 16 bit pointer ke objek daftar. Yang tidak diperlukan setelah membuat adaptor karena adaptor memiliki metode add.
17

Jika Anda ingin memiliki ListView di AppCompatActivity alih-alih ListActivity, Anda dapat melakukan hal berikut (Memodifikasi jawaban Shardul):

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

Dan dalam tata letak Anda alih-alih menggunakan, android:id="@android:id/list"Anda dapat menggunakanandroid:id="@+id/listDemo"

Jadi sekarang Anda dapat memiliki bagian ListViewdalam yang normal AppCompatActivity.

srinivas
sumber
13

Kode untuk file MainActivity.java.

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

Kode untuk file layout activity_main.xml.

<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

masukkan deskripsi gambar di sini

Amir Hosseinzadeh
sumber
0

Jawaban singkatnya: ketika Anda membuat ListView, Anda memberikannya referensi ke data. Sekarang, setiap kali data ini akan diubah, itu akan mempengaruhi tampilan daftar dan dengan demikian menambahkan item ke dalamnya, setelah Anda akan memanggil adaptor.notifyDataSetChanged () ;.

Jika Anda menggunakan RecyclerView, perbarui hanya elemen terakhir (jika Anda telah menambahkannya di akhir daftar objek) untuk menghemat memori dengan: mAdapter.notifyItemInserted (mItems.size () - 1);

Oz Shabat
sumber
0

Ini adalah jawaban sederhana bagaimana cara menambahkan data secara dinamis di listview android kotlin

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

    }
}

Di sini saya hanya menjelaskan dua cara, kita bisa melakukan ini dengan banyak cara.

sirajudheen tk
sumber
Di mana bagian yang Anda tambahkan ke ListView?
Onie Maniego
@OnieManiego di sini saya menambahkan item ke listview dalam dua cara, Anda dapat melihat bahwa di atas 1. listItems.add ("a") listItems.add ("b") listItems.add ("c") listItems.add ("d ") listItems.add (" e ") ini adalah cara pertama yang saya tambahkan 2. untuk (item dalam array) listItems.add (item) cara kedua saya menambahkan semua item dari array
sirajudheen tk
@OnieManiego, saya harap Anda mengerti, jika itu membantu Anda
tolong bantu