Обновить список при нажатии кнопки [дубликат]

Теперь это можно сделать в Chrome, Safari, FF4 + и IE10pp4 +!

См. ответ на этот вопрос для получения дополнительной информации: Обновление адресной строки с новым URL без хеша или перезагрузка страницы

Пример:

  function processAjaxData (response, urlPath) {document.getElementById ("content"). innerHTML = response.html;  document.title = response.pageTitle;  window.history.pushState ({"html": response.html, "pageTitle": response.pageTitle}, "", urlPath);  }  

Затем вы можете использовать window.onpopstate для поиска навигации по кнопке назад / вперед:

  window.onpopstate = function  (e) {if (e.state) {document.getElementById ("content"). innerHTML = e.state.html;  document.title = e.state.pageTitle;  }};   

Для более глубокого изучения работы с историей браузера см. эту статью MDN .

283
задан dev.mi 31 August 2014 в 16:49
поделиться

5 ответов

Сначала создайте XML-макет в папке res/layout/main.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 имеет id @android:id/list, который определяет значение по умолчанию ListView a 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, и вы можете использовать этот макет запаса для не-сложных вещей.

listItems - это список, в котором хранятся данные, отображаемые в ListView. Все вставки и удаления должны выполняться на listItems; изменения в listItems должны быть отражены в представлении. Это обрабатывается с помощью ArrayAdapter<String> adapter, который должен быть уведомлен с помощью:

adapter.notifyDataSetChanged();

Адаптер создается с помощью трех параметров: контекст, который может быть вашим activity/listactivity; расположение вашего индивидуального элемента списка; и, наконец, список, который является фактическими данными, которые будут отображаться в списке.

560
ответ дан elimirks 15 August 2018 в 20:20
поделиться
  • 1
    кажется, он не доволен ;-) – Saqib 19 September 2013 в 11:29
  • 2
    Я не понимаю, как ListView присоединяется к нашей деятельности здесь. – Breedly 3 October 2013 в 17:20
  • 3
    @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 20 March 2014 в 03:21
  • 4
    Давайте покажем счастье, когда будет получен правильный ответ: / – support_ms 24 May 2014 в 05:32
  • 5
    Если элемент в ArrayList более сложный, например, загрузка из Интернета, и каждый элемент содержит видеоизображение и что-то в этом роде, повлияет ли этот подход на производительность? – zionpi 18 February 2016 в 09:30

Сначала вы должны добавить 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();
        }
    });
}

Это работает для меня , Надеюсь, я помог вам

43
ответ дан Rob Rose 15 August 2018 в 20:20
поделиться
  • 1
    Очень хорошее объяснение и спасибо, особенно для объяснения элемента адаптера, который, кажется, волшебным образом появляется на всех остальных примерах. :) – raddevus 17 February 2016 в 21:17
  • 2
    Это лучший пример, который я нашел для этого :) – Dinuka Salwathura 22 June 2018 в 16:34

Код для файла 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>

ScreenShot

6
ответ дан S4beR 15 August 2018 в 20:20
поделиться

Если вы хотите иметь ListView в AppCompatActivity, а не ListActivity, вы можете сделать следующее (Изменить ответ 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.

16
ответ дан Shubham Khatri 15 August 2018 в 20:20
поделиться

вместо

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

вы можете напрямую вызвать

adapter.add("New Item");
57
ответ дан venkat530 15 August 2018 в 20:20
поделиться
  • 1
    в чем разница @ venkat530? Это лучшая практика или ... что-то? – gumuruh 12 July 2014 в 10:03
  • 2
    @gumuruh сам адаптер изменен, поэтому мы можем напрямую добавлять или удалять объекты, которые будут автоматически вызывать notifyDatasetChanged () и getView () из спискаViewView. Это уменьшает дополнительную строку кода. – venkat530 14 July 2014 в 01:34
  • 3
    поэтому, добавив в адаптер, автоматически вызывайте notifyDatasetChanged ()? О, я вижу. Спасибо @ venkat530. Но как насчет самого списка? Я имею в виду, если сначала скажем, что он создал arraylist, который использовался в качестве контейнера данных для адаптера. И теперь вы просто добавляете элемент непосредственно к адаптеру вместо этого в arraylist. Обновлены ли данные arraylist / нетронутыми? – gumuruh 14 July 2014 в 03:58
  • 4
    @gumuruh вторая - лучшая практика, потому что синхронизирована. – Ricardo 8 December 2015 в 19:14
  • 5
    @gumuruh от беглых экспериментов и исходного кода ArrayAdapter [ github.com/android/platform_frameworks_base/blob/master/core/… , похоже, что базовый набор данных также будет изменен. – CCJ 31 March 2017 в 21:58
Другие вопросы по тегам:

Похожие вопросы: