Android에서 listView에 요소를 동적으로 추가하는 방법


326

누구나 안드로이드에서 listView를 만드는 자습서를 설명하거나 제안 할 수 있습니까?

내 요구 사항은 다음과 같습니다.

  • 버튼을 눌러 동적으로 새 요소를 추가 할 수 있어야합니다.
  • 이해할 수있을만큼 단순해야합니다 (예 : 성능 개선 또는 전환보기가 없을 수 있음)

이 주제에 관한 몇 가지 질문이 있으며 여기에 StackOverflow에 게시되어 있지만 내 질문에 대한 답변을 찾지 못했습니다. 감사!


3
Shardul의 현재 가장 투표가 많은 답변은 고품질로 간주되며 사용자는 수락해야한다고 생각했습니다. 받아 들일 수 있습니까?
매트 웰케

답변:


583

프로젝트 res/layout/main.xml폴더 에서 먼저 XML 레이아웃을 작성하십시오 .

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

상단에는 버튼이 있고 하단에는 목록보기가있는 간단한 레이아웃입니다. 참고는 것을 ListView아이디가 @android:id/list기본 정의 ListViewA가 ListActivity사용할 수 있습니다.

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에서 제공하는 기본 목록 항목 레이아웃이며이 재고 레이아웃을 복잡하지 않은 항목에 사용할 수 있습니다.

listItemsListView에 표시된 데이터를 보유하는 List입니다. 모든 삽입 및 제거는 다음에 수행해야합니다 listItems. 변경 사항 listItems이보기에 반영되어야합니다. 에 의해 처리되며 ArrayAdapter<String> adapter다음을 사용하여 알려야합니다.

adapter.notifyDataSetChanged();

어댑터는 3 개의 매개 변수로 인스턴스화됩니다. 컨텍스트는 사용자의 activity/listactivity; 개별 목록 항목의 레이아웃; 마지막으로 목록은 목록에 표시 될 실제 데이터입니다.


2
ListView가 어떻게 우리의 활동에 첨부되는지 이해하지 못합니다.
Breedly

7
@Breedly ListActivity 이기 때문에 ListView가있는 레이아웃이있는 Activity가 아닙니다 . ID의보기를 찾을 필요가 없습니다. 참조 :에서 읽을 수 있습니다 ListActivity is an activity that includes a ListView as its only layout element by default. [...] (it) hosts a ListView object. 따라서 기본적으로 메소드 ( setAdapter 등)는 클래스의 "내부"입니다.
fllo

정답 받고있다하자 쇼 행복 : /
support_ms

1
인터넷에서로드하는 것과 같이 ArrayList의 요소가 더 복잡하고 각 항목에 이미지 비디오가 포함되어 있으면 성능이 저하 될 수 있습니까?
zionpi

1
이것을 조각으로 어떻게 구현할 수 있습니까?
오아 마르 칸지

64

대신에

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

직접 전화 할 수 있습니다

adapter.add("New Item");

@gumuruh 어댑터 자체는 변경 가능하므로 listView의 notifyDatasetChanged () 및 getView ()를 자동으로 호출하는 객체를 직접 추가하거나 제거 할 수 있습니다. 이렇게하면 추가 코드 줄이 줄어 듭니다.
venkat530

어댑터에 추가하면 자동으로 notifyDatasetChanged ()를 호출합니다. 아, 알겠습니다 감사합니다 @ venkat530. 그러나 목록 자체는 어떻습니까? 먼저 말하면 어댑터의 데이터 컨테이너로 사용되는 배열 목록을 만들었습니다. 이제 배열 목록 대신 어댑터에 직접 항목을 추가하면됩니다. 배열 목록 데이터가 업데이트 / 변경되지 않습니까?
gumuruh

1
@gumuruh는 동기화되기 때문에 두 번째 모범 사례입니다.
Ricardo

1
커서 실험과 ArrayAdapter 소스 코드 [ github.com/android/platform_frameworks_base/blob/master/core/… 에서 @gumuruh , 기본 데이터 세트도 수정 된 것처럼 보입니다.
CCJ

Shardul의 답변이 작동하고 깨졌으며 수리 방법을 알 수 없었습니다. 변덕에, 나는 이것을 시도 할 것이라고 생각했고, 짜잔, 그것은 다시 작동합니다! 대단히 감사합니다! 그래도 어떻게 또는 왜 그것을 고쳤는지 전혀 모른다. 어떤 생각?
donutguy640

55

먼저, Activity_main.xml에 ListView, EditText 및 버튼을 추가해야합니다.

이제 ActivityMain에서 :

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

이것은 나를 위해 작동합니다, 나는 당신을 도왔기를 바랍니다


4
매우 좋은 설명과 특히 어댑터 항목을 설명해 주셔서 감사합니다. 다른 모든 사람들의 예에서 마술처럼 보입니다. :)
raddevus

1
이것은 내가 찾은 최고의 예입니다 :)
Dinuka Salwathura

이 답변은 그 사람이 요구 한 것을 만족시켰다. 복잡한 개선없이 간단하고 깨끗합니다. 최고 답변은 실제로 그랜드 마스터 만 아는 ListActivity를 소개합니다. 내 유일한 문제는 이제 목록의 뷰에 드로어 블과 물건을 추가하는 방법입니다. 나만 문자열을 추가하는 것 같습니다.

리스트 오브젝트에 대한 16 비트 포인터를 작성하는 것보다 어댑터에서 이름이없는 List 오브젝트를 작성하는 것이 최적화 일 수 있습니다. 어댑터에는 add 메소드가 있으므로 어댑터를 작성한 후 필요하지 않습니다.

17

ListActivity 대신 AppCompatActivity에 ListView를 사용하려면 다음을 수행 할 수 있습니다 (@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;
        }
    }
}

그리고 당신 대신에 android:id="@android:id/list"당신이 사용할 수있는 레이아웃android:id="@+id/listDemo"

이제 ListView법선 내부를 가질 수 있습니다 AppCompatActivity.


12

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

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>

스크린 샷

여기에 이미지 설명을 입력하십시오


0

짧은 대답 : ListView를 만들 때 데이터에 대한 참조를 전달합니다. 이제이 데이터가 변경 될 때마다 adapter.notifyDataSetChanged ();를 호출 한 후 목록보기에 영향을 미쳐 항목을 추가합니다.

RecyclerView를 사용하는 경우 마지막 요소 만 (obj 목록의 끝에 추가 한 경우) 메모리를 절약하려면 다음을 사용하십시오. mAdapter.notifyItemInserted (mItems.size ()-1);


0

이것은 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")

    }
}

여기서 나는 두 가지 방법을 설명했습니다. 우리는이 많은 방법을 할 수 있습니다.


ListView에 추가 한 부분은 어디에 있습니까?
Onie Maniego

@OnieManiego 여기에 두 가지 방법으로 listview에 항목을 추가하면 위의 항목 1을 볼 수 있습니다. listItems.add ( "a") listItems.add ( "b") listItems.add ( "c") listItems.add ( "d ") listItems.add ("e ") 이것이 내가 추가 한 첫 번째 방법입니다. for (배열의 항목) listItems.add (items) 배열의 모든 항목을 추가 한 두 번째 방법
sirajudheen tk

@OnieManiego 나는 당신이 pls
공감에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.