- Обновление, после более подробного изучения документации, я думаю, вы все еще можете использовать 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, но я не уверен (это может случиться для вас) .. Сначала я попробую это сделать без него и посмотрю, все ли работает как положено, и если не добавлять его.
Теперь одна вещь, которую вы, вероятно, захотите сделать, - это сделать переменную адаптера переменной экземпляра вашего класса, чтобы вы могли использовать ее в любом месте класса.