web-dev-qa-db-ja.com

リストビューに要素を動的に追加する

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

これが私の要求です。

  • ボタンを押すことで新しい要素を動的に追加できるはずです。
  • 理解するのに十分なほど単純であるべきです(たとえば、パフォーマンスの改善やconvertviewなどはおそらく必要ありません)。

StackOverflowに掲載されているこのトピックに関する質問はかなりたくさんありますが、私の質問に答えるような質問は見つかりませんでした。ありがとうございます。

308
user555217

まずプロジェクトの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>

これは上部にボタンがあり、下部にリストビューがある単純なレイアウトです。 ListViewListViewが使用できるデフォルトのListActivityを定義するid @Android:id/listを持つことに注意してください。

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が提供するデフォルトのリストアイテムレイアウトです。このストックレイアウトを複雑でないものに使用できます。

listItemsは、ListViewに表示されているデータを保持するListです。すべての挿入と削除はlistItemsで行われるべきです。 listItemsの変更はビューに反映されるべきです。これはArrayAdapter<String> adapterによって処理されます。

adapter.notifyDataSetChanged();

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

578
Shardul

の代わりに

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

あなたは直接呼び出すことができます

adapter.add("New Item");
59
venkat530

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

これは私のために働きます、私はあなたを助けたことを願っています

50
Robert

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を持つことができます。

17
srinivas

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>

スクリーンショット

enter image description here

9