Cách thêm phần tử vào danh sách Xem động trong Android


326

Bất cứ ai cũng có thể giải thích hoặc đề xuất một hướng dẫn để tạo một listView trong Android?

Dưới đây là yêu cầu của tôi:

  • Tôi có thể tự động thêm các yếu tố mới bằng cách nhấn một nút.
  • Phải đủ đơn giản để hiểu (chẳng hạn như không có bất kỳ cải tiến hiệu suất hoặc chuyển đổi nào)

Tôi biết có khá nhiều câu hỏi về chủ đề này, được đăng ở đây trên StackOverflow, nhưng không thể tìm thấy câu trả lời nào cho câu hỏi của tôi. Cảm ơn!


3
Câu trả lời được bình chọn cao nhất hiện tại từ Shardul được coi là chất lượng cao và người dùng đã bày tỏ rằng họ cảm thấy nó nên được chấp nhận. Bạn có thể xem xét chấp nhận nó?
Matt Welke

Câu trả lời:


583

Tạo bố cục XML đầu tiên trong res/layout/main.xmlthư mục dự án của bạn :

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

Đây là một bố cục đơn giản với một nút ở trên cùng và chế độ xem danh sách ở phía dưới. Lưu ý rằng ListViewid @android:id/listcó định nghĩa mặc định ListViewa ListActivitycó thể sử dụng.

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 là bố cục mục danh sách mặc định do Android cung cấp và bạn có thể sử dụng bố cục kho này cho những thứ không phức tạp.

listItemslà một Danh sách chứa dữ liệu được hiển thị trong ListView. Tất cả các chèn và loại bỏ nên được thực hiện trên listItems; những thay đổi trong listItemsnên được phản ánh trong quan điểm. Điều đó được xử lý bởi ArrayAdapter<String> adapter, cần được thông báo bằng cách sử dụng:

adapter.notifyDataSetChanged();

Một bộ chuyển đổi được khởi tạo với 3 tham số: bối cảnh, có thể là của bạn activity/listactivity; cách bố trí mục danh sách cá nhân của bạn; và cuối cùng, danh sách, đó là dữ liệu thực tế sẽ được hiển thị trong danh sách.


2
Tôi không hiểu làm thế nào ListView gắn liền với hoạt động của chúng tôi ở đây.
Nhân giống

7
@Breedly Bởi vì đó là ListActivity chứ không phải là Activity có bố cục với ListView . Bạn không cần phải tìm quan điểm của id. Như bạn có thể đọc trên Tài liệu tham khảo : ListActivity is an activity that includes a ListView as its only layout element by default. [...] (it) hosts a ListView object. Vì vậy, theo mặc định, các phương thức (như setAd CHƯƠNG , v.v.) nằm trong "Class".
fllo

Hãy thể hiện niềm hạnh phúc khi câu trả lời đúng được nhận: /
support_ms

1
Nếu phần tử trong ArrayList phức tạp hơn, chẳng hạn như tải từ Internet và mỗi mục chứa video hình ảnh và một cái gì đó tương tự, liệu cách tiếp cận này có phải là hiệu năng đối mặt?
zionpi

1
Làm thế nào tôi có thể thực hiện điều này trong một mảnh?
Oamar Kanji

64

thay vì

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

bạn có thể gọi trực tiếp

adapter.add("New Item");

@gumuruh chính bộ điều hợp có thể thay đổi để chúng ta có thể trực tiếp thêm hoặc xóa các đối tượng sẽ gọi notifyDatasetChanged () và getView () của listView. Điều này làm giảm dòng mã thêm.
venkat530

vì vậy bằng cách thêm vào bộ điều hợp tự động gọi notifyDatasetChanged ()? Ồ, tôi hiểu rồi. Cảm ơn @ venkat530. Nhưng những gì về danh sách chính nó? Ý tôi là nếu nói trước tiên anh ta đã tạo ra một danh sách mảng được sử dụng làm nơi chứa dữ liệu cho bộ điều hợp. Và bây giờ bạn chỉ cần thêm một mục trực tiếp vào bộ chuyển đổi thay vào danh sách mảng. Dữ liệu danh sách mảng sẽ được cập nhật / không bị ảnh hưởng?
gumuruh

1
@gumuruh thứ hai là cách thực hành tốt nhất vì được đồng bộ hóa.
Ricardo

1
@gumuruh từ thử nghiệm chữ thảo và mã nguồn ArrayAd CHƯƠNG [ github.com/android/pl platform_frameworks_base/blob/master/core/iêu , có vẻ như bộ dữ liệu cơ bản cũng sẽ được sửa đổi.
CCJ

Tôi đã làm cho câu trả lời của Shardul hoạt động, sau đó phá vỡ nó và không thể tìm ra cách sửa chữa nó. Trong một ý thích bất chợt, tôi nghĩ rằng tôi sẽ thử nó, và thì đấy, nó hoạt động trở lại! Cảm ơn rât nhiều! Mặc dù, tôi không biết làm thế nào hoặc tại sao nó sửa nó. Bất kỳ ý tưởng?
donutguy640

55

Trước tiên, bạn phải thêm ListView, EditText và nút vào Activity_main.xml của bạn.

Bây giờ, trong ActivityMain của bạn:

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

Điều này làm việc cho tôi, tôi hy vọng tôi đã giúp bạn


4
Giải thích rất tốt và đặc biệt cảm ơn vì đã giải thích mục bộ điều hợp - dường như xuất hiện một cách kỳ diệu trong các ví dụ của mọi người khác. :)
raddevus 17/2/2016

1
Đây là ví dụ tốt nhất tôi tìm thấy cho việc này :)
Dinuka Salwathura

Câu trả lời này thỏa mãn những gì người yêu cầu. Đơn giản và sạch sẽ mà không cần cải tiến phức tạp. Câu trả lời hàng đầu thực sự giới thiệu ListActivity, điều mà chỉ những bậc thầy lớn mới biết. Vấn đề duy nhất của tôi bây giờ là làm thế nào để tôi thêm drawables và thứ vào khung nhìn trong danh sách. Dường như với tôi tôi chỉ thêm chuỗi.

Tối ưu hóa có thể là tạo đối tượng Danh sách không tên trong Bộ điều hợp hơn là tạo con trỏ 16 bit cho đối tượng danh sách. Không cần thiết sau khi tạo bộ điều hợp vì bộ điều hợp có phương thức thêm.

17

Nếu bạn muốn có ListView trong AppCompatActivity thay vì ListActivity, bạn có thể làm như sau (Sửa đổi câu trả lời của @ 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;
        }
    }
}

Và trong bố trí của bạn thay vì sử dụng, android:id="@android:id/list"bạn có thể sử dụngandroid:id="@+id/listDemo"

Vì vậy, bây giờ bạn có thể có một ListViewbên trong bình thường AppCompatActivity.


12

Mã cho tệp 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();
            }
        });
    }
}

Mã cho tệp bố trí 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>

Ảnh chụp màn hình

nhập mô tả hình ảnh ở đây


0

Câu trả lời ngắn: khi bạn tạo ListView, bạn chuyển nó tham chiếu đến dữ liệu. Bây giờ, bất cứ khi nào dữ liệu này sẽ bị thay đổi, nó sẽ ảnh hưởng đến chế độ xem danh sách và do đó thêm mục vào đó, sau khi bạn gọi bộ điều hợp.notifyDataSetChanged ();.

Nếu bạn đang sử dụng RecyclerView, chỉ cập nhật phần tử cuối cùng (nếu bạn đã thêm nó vào cuối danh sách objs) để lưu bộ nhớ với: mAd CHƯƠNG.notifyItemInserted (mItems.size () - 1);


0

Đây là câu trả lời đơn giản làm thế nào để thêm dữ liệu động trong 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")

    }
}

Ở đây tôi chỉ giải thích hai cách, chúng ta có thể làm điều này theo nhiều cách.


Phần mà bạn thêm nó vào ListView ở đâu?
Onie Maniego

@OnieManiego ở đây tôi đã thêm các mục vào listview theo hai cách, bạn có thể thấy ở trên 1. listItems.add ("a") listItems.add ("b") listItems.add ("c") listItems.add ("d ") listItems.add (" e ") đây là cách đầu tiên tôi thêm 2. cho (các mục trong mảng) listItems.add (các mục) cách thứ hai tôi đã thêm tất cả các mục từ mảng
sirajudheen tk

Không phải đó là mảng không phải là listview sao? cảm ơn
Onie Maniego

@OnieManiego tôi hy vọng bạn hiểu, nếu điều đó hữu ích cho bạn, vui lòng upvote
sirajudheen tk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.