Androidで動的に要素をlistViewに追加する方法


326

誰でもAndroidでlistViewを作成するためのチュートリアルを説明または提案できますか?

これが私の要件です:

  • ボタンを押すことで新しい要素を動的に追加できるはずです。
  • 理解するのに十分単純である必要があります(たとえば、パフォーマンスの向上や変換ビューなしで)

StackOverflowに投稿されているこのトピックにはかなりの数の質問があることを知っていますが、私の質問に答える質問が見つかりませんでした。ありがとう!


3
Shardulからの現在最も高い投票の回答は高品質であると見なされ、ユーザーは受け入れるべきだと感じていると述べています。受け入れてもらえますか?
Matt Welke 2017年

回答:


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>

これは、上部にボタンがあり、下部にリストビューがあるシンプルなレイアウトです。には、a が使用できるデフォルトを定義ListViewするIDが@android:id/listあることに注意してください。ListViewListActivity

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に表示されるデータを保持するリストです。すべての挿入と削除はで行う必要がありlistItemsます。の変更がlistItemsビューに反映されます。これはによって処理されArrayAdapter<String> adapter、次の方法で通知されます。

adapter.notifyDataSetChanged();

アダプターは、3つのパラメーターでインスタンス化されますactivity/listactivity。個々のリストアイテムのレイアウト。最後に、リストはリストに表示される実際のデータです。


2
ここで、ListViewがどのようにアクティビティに接続するのか理解できません。
ブリードリー2013年

7
@BreedlyこれはListActivityであり、ListViewのレイアウトを持つアクティビティではないためです。IDのビューを見つける必要はありません。あなたがリファレンスで読むことができるように:ListActivity is an activity that includes a ListView as its only layout element by default. [...] (it) hosts a ListView object。したがって、デフォルトでは、メソッド(setAdapterなど)はクラスの「内部」にあります。
fllo 2014年

正しい答えが得られたときに幸せを示しましょう:/
support_ms

1
インターネットからの読み込みなど、ArrayListの要素がより複雑で、各アイテムにイメージビデオなどが含まれている場合、このアプローチはパフォーマンスに影響しますか?
zionpi 2016

1
これをフラグメントにどのように実装できますか?
Oamar Kanji 2018

64

の代わりに

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

あなたは直接電話することができます

adapter.add("New Item");

@gumuruhアダプタ自体は可変なので、listViewのnotifyDatasetChanged()およびgetView()を自動的に呼び出すオブジェクトを直接追加または削除できます。これにより、余分なコード行が削減されます。
venkat530 2014

アダプターに追加することにより、notifyDatasetChanged()を自動的に呼び出しますか?ああなるほど。@ venkat530に感謝します。しかし、リスト自体はどうですか?つまり、最初に彼がアダプタのデータコンテナとして使用されるarraylistを作成したとしましょう。そして、配列リストではなく、アダプタに直接項目を追加するだけです。arraylistデータは更新/変更されませんか?
グムル

1
@gumuruhは同期されるため、2番目がベストプラクティスです。
Ricardo

1
ざっくりとした実験による@gumuruhとArrayAdapterソースコード[ github.com/android/platform_frameworks_base/blob/master/core/…、基になるデータセットも変更されるようです。
CCJ 2017年

私はShardulの答えが機能するようになり、それを壊し、それを修復する方法を理解できませんでした。気まぐれで、私はこれを試してみようと思いました、そして出来上がり、それは再び動きます!どうもありがとうございました!しかし、それがどのように、またはなぜそれを修正したのかはわかりません。何か案が?
donutguy640 2017

55

まず、listView、EditText、およびボタンをactivity_main.xmlに追加する必要があります。

今、あなたの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 2016

1
これは私がこれのために見つけた最良の例です:)
Dinuka Salwathura

この答えは、その人が求めていたものを満たしました。複雑で改善せずにシンプルでクリーン。一番上の答えは、実際にはグランドマスターだけが知っているListActivityを紹介しています。私の唯一の問題は、リスト内のビューにドローアブルなどを追加する方法です。文字列を追加しているだけのようです。

最適化は、リストオブジェクトへの16ビットポインターを作成するよりも、アダプターに名前のないリストオブジェクトを作成することです。アダプターにはaddメソッドがあるため、アダプターの作成後には必要ありません。

17

ListViewをListActivityではなくAppCompatActivityに含めたい場合は、次のようにします(@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


13

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

    }
}

ここでは2つの方法を説明しましたが、これには多くの方法があります。


リストビューに追加する部分はどこですか?
Onie Maniego

@OnieManiegoここで私は2つの方法でリストビューに項目を追加しました。上の図をご覧ください。1. listItems.add( "a")listItems.add( "b")listItems.add( "c")listItems.add( "d ")listItems.add(" e ")これは私が追加した最初の方法です2. for(items in array)listItems.add(items)2番目の方法で配列からすべての項目を追加しました
sirajudheen tk

@OnieManiego私はあなたが理解することを願っています、それがあなたに役立つ場合は
賛成投票
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.