Добавление динамических массивов строк в динамический просмотр списка в Android - PullRequest
3 голосов
/ 26 февраля 2012

У меня есть строковый массив, который извлекается из внешнего XML-ответа. Этот строковый массив может быть представлен в виде списка. Я хочу добавить массив строк с новыми данными XML и добавлять его в просмотр списка каждый раз, когда пользователь достигает конечного элемента массива строк в просмотре списка. Как мне этого добиться? Я много исследовал эту тему. Я едва мог найти примеры, связанные с этим контекстом. Любая помощь будет высоко ценится. Спасибо.

  ArrayList<String> get_msgList =MsgHandler.getMsgsList();
String[] msgList=new String[get_msgList.size()];
msgList=get_msgList.toArray(msgList);

 ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1, get_msgList );
myListView.setAdapter(adapter);

Вот так я получаю свой строковый массив и добавляю его в список.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

- Обновление, после более подробного изучения документации, я думаю, вы все еще можете использовать ArrayAdapter -

Так что, если вы посмотрите на документацию для listview , вы увидите

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="countries_array">
        <item>Bahrain</item>
        <item>Bangladesh</item>
        <item>Barbados</item>
        <item>Belarus</item>
        <item>Belgium</item>
        <item>Belize</item>
        <item>Benin</item>
    </string-array>
</resources>

и загрузить те, которые вы используете:

setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, countries));

Проблема здесь в том, что вам приходится разбираться, когда они доходят до конца списка, и как загружать больше данных, не блокируя пользовательский интерфейс.

Таким образом, чтобы избавить себя от головной боли, я рекомендую использовать Commonsware Endless Adapter Сделайте так, как это:

import android.app.ListActivity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import com.commonsware.cwac.endless.EndlessAdapter;
import java.util.ArrayList;

public class YourListActivity extends ListActivity {
  @Override
  public void onCreate(Bundle state) {
    super.onCreate(state);
    setContentView(R.layout.main);
    String[] countries = getResources().getStringArray(R.array.countries_array);
    setListAdapter(new YourAdapter(countries));
  }

  class YourAdapter extends EndlessAdapter {


    public YourAdapter(String[] list) {
      super(new ArrayAdapter<String>(YourAdapter.this,
                                      R.layout.row,
                                      android.R.id.text1,
                                      list));
    }

    @Override
    protected View getPendingView(ViewGroup parent) {
      View row=getLayoutInflater().inflate(R.layout.row, null);      
      return row.findViewById(android.R.id.text1);      
    }

    @Override
    protected boolean cacheInBackground() {
      SystemClock.sleep(10000);       // pretend to do work
      //put logic here to fetch the data
      //this happens in the background so you can't do anything with the UI
      //return whether or not you have more data, true if you do false otherwise.
      boolean haveMoreData = true;//this up to you to figure out
      return haveMoreData;
    }

    @Override
    protected void appendCachedData() {
        //here is where you do the work to actually add the data obtained in cacheInBackground to the ArrayAdapter
        ArrayAdapter<String> a=(ArrayAdapter<String>)getWrappedAdapter();        
        for (int i=0;i<25;i++) { 
           a.add(a.getCount()); 
        }
      }
    }
  }
}

вот еще один вопрос, похожий на ваш здесь: Бесконечный список Android

- Обновление: как добавить несколько массивов строк в адаптер - Есть несколько способов сделать это, самый простой способ, вероятно, будет использовать метод добавления адаптеров.

Посмотрите на это: http://developer.android.com/reference/android/widget/ArrayAdapter.html и посмотреть метод добавить. В настоящее время у вас есть переменная с именем адаптер:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, get_msgList);

Всякий раз, когда вы хотите добавить дополнительные данные в этот адаптер, просто позвоните:

  adapter.add("Some new data");

Так что, если у вас был другой массив данных String [] и вы хотите добавить все это к текущему адаптеру, просто используйте:

   String[] someNewData = getStringArray();//no idea how you are getting the array, this is just an example
   for (String s : someNewData) {
      adapter.add(s);
    }

После того, как вы добавили новые данные, вам может потребоваться вызвать adaptor.notifyDataSetChanged, но я не уверен (это может случиться для вас) .. Сначала я попробую это сделать без него и посмотрю, все ли работает как положено, и если не добавлять его.

Теперь одна вещь, которую вы, вероятно, захотите сделать, - это сделать переменную адаптера переменной экземпляра вашего класса, чтобы вы могли использовать ее в любом месте класса.

0 голосов
/ 26 февраля 2012

Интересно, сколько данных покажет этот просмотр списка?Из информации, которую вы дали, звучит так, как будто вам нужно реализовать onScrollListener.Это позволит вам загружать больше данных, когда вы попадете в конец списка (например, приложение facebook).Как и ответ Мэтта о том, что вы не должны вмешиваться в загрузку вашего пользовательского интерфейса, вам нужно будет настроить поток для загрузки данных за пределы вашего пользовательского интерфейса.

Когда вы говорите о загрузке из внешнего источника.Это через интернет?Если это так, приведенная выше информация должна указать вам правильное направление.Если под внешним вы подразумеваете в другом классе, вам, вероятно, лучше загрузить их все вместе или сохранить в базе данных и запустить курсор, чтобы получить из него то, что вам нужно.

...