我试图更新我的列表视图,以建立一个“无休止的滚动”。所发生的是,前40个结果加载很好,当我到达滚动的底部,接下来的40个结果取代了前40个.
我想要的是第二组40的结果添加到前40,所以我有一个无休止的列表和能力回滚动到列表的开头。
我在下面张贴我的代码。谢谢!
public class SearchResults extends Activity implements BannerAdListener, OnScrollListener{
private LinearLayout bottomNav;
private ListView ringtoneList;
private int start = 0, num = 40, curPage = 1;
private Handler handler = new Handler();
private ProgressDialog progressDialog = null;
private ArrayList<Ringtone> ringtones;
private MoPubView moPubView;
private String searchString;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
if (extras == null) {
// no search string defined
finish();
} else {
searchString = extras.getString("search_string");
}
setContentView(R.layout.search_results);
ringtoneList = (ListView)findViewById(R.id.ringtone_list);
ringtoneList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> av, View view, int position, long id) {
Intent i = new Intent(SearchResults.this, RingtoneView.class);
i.putExtra("ringtone", ringtones.get(position));
startActivity(i);
}
});
performSearch();
moPubView = (MoPubView) findViewById(R.id.adview);
moPubView.setAdUnitId(Utils.MoPubBannerId);
moPubView.loadAd();
moPubView.setBannerAdListener(this);
ringtoneList.setOnScrollListener(this);
}
public void onScroll(AbsListView view, int firstVisible, final int visibleCount, int totalCount) {
Log.i("List", "firstVisible="+firstVisible+" visibleCount="+visibleCount+" totalCount="+totalCount);
boolean loadMore = firstVisible + visibleCount >= totalCount;
if(loadMore) {
Log.i("List", "Loading More Results");
curPage++;
start = num * (curPage-1);
new Thread() {
public void run() {
ringtones = Utils.search(start, num, searchString);
if (ringtones != null && ringtones.size() > 0) {
handler.post(new Runnable() {
public void run() {
ringtoneList.setAdapter(new RingtoneRowAdapter(SearchResults.this, ringtones));
}
});
} else {
handler.post(new Runnable() {
public void run() {
new AlertDialog.Builder(SearchResults.this)
.setTitle(getResources().getString(R.string.context_info)).setMessage(getResources().getString(R.string.context_noresult))
.setPositiveButton(getResources().getString(R.string.context_ok), null).show();
}
});
}
}
}
.start();
}
}
public void onScrollStateChanged(AbsListView v, int s) { }
private void performSearch() {
progressDialog = ProgressDialog.show(SearchResults.this, getResources().getString(R.string.loading_message), getResources().getString(R.string.loading_search), true);
new Thread() {
public void run() {
ringtones = Utils.search(start, num, searchString);
if (ringtones != null && ringtones.size() > 0) {
updateList();
} else {
handler.post(new Runnable() {
public void run() {
new AlertDialog.Builder(SearchResults.this)
.setTitle(getResources().getString(R.string.context_info)).setMessage(getResources().getString(R.string.context_noresult))
.setPositiveButton(getResources().getString(R.string.context_ok), null).show();
ringtoneList.setVisibility(View.INVISIBLE);
bottomNav.setVisibility(View.INVISIBLE);
}
});
}
progressDialog.dismiss();
}
}.start();
}
private void updateList() {
handler.post(new Runnable() {
public void run() {
//Log.d("search", "ringtones.size() " + ringtones.size());
ringtoneList.setVisibility(View.VISIBLE);
ringtoneList.setAdapter(new RingtoneRowAdapter(SearchResults.this, ringtones));
}
});
}
}请帮帮我!谢谢!
发布于 2013-10-31 19:50:11
虽然我不能100%确定,但我认为您的问题与以下事实有关:您正在设置一个新适配器,该适配器只包含负载中的铃声部分。这可能与以下片段有关:
ringtones = Utils.search(start, num, searchString);
if (ringtones != null && ringtones.size() > 0) {
handler.post(new Runnable() {
public void run() {
ringtoneList.setAdapter(new RingtoneRowAdapter(SearchResults.this, ringtones));
}
});
}与其添加一个全新的铃声数组,不如将其添加到您已经拥有的铃声上。您的ringtones变量已经是一个实例变量,所以我确信如果您更改了这一行:
ringtones = Utils.search(start, num, searchString);以下各点:
ringtones.addAll(Utils.search(start, num, searchString));它可能会解决你的问题。
发布于 2013-10-31 19:50:18
您的代码有点混乱,但是您的updateList方法正在创建一个新的RingtoneRowAdapter。应该将项添加到列表中,并调用
mRingtoneRowAdapter.notifyDatasetChanged();这将告诉适配器获得新视图(如果需要的话),以及在adapter级别上发生的大量内部事件。所以有点像:
private void updateList() {
handler.post(new Runnable() {
public void run() {
if ( mAdapter == null ) {
mAdapter = new RingtoneRowAdapter(SearchResults.this, ringtones);
ringtoneList.setAdapter(mAdapter);
} else {
mAdapter.notifyDataSetChanged();
}
ringtoneList.setVisibility(View.VISIBLE);
}
});
}当然,正如前面提到的,不要总是在你的铃声数组中插入。把数据加进去就行了。
你不需要(大多数时候)隐藏列表,你可以添加你的布局,任何视图(包括一个完整的布局!)有下列证件的:
android:id="@android:id/empty"如果您的ListView的id为android:id="@id/android: list ",并且您位于ListFragment或ListActivity中,那么当列表为空时,将显示“空”布局(如果您不想看到它,可以是一个虚拟视图)。
只是建议:)
UPDATE:对于null,我看到逻辑有点奇怪,因为我们不知道应用程序的需求(也就是说,如果没有结果怎么办,如果结果无效怎么办,等等)。我假设你只是想确保它有效,然后再处理。
因此,考虑到这一点,我看到了两个问题。
一个快速的解决方案是在搜索…之前检查null我会亲自在搜索函数中这样做。
类似于:
public ArrayList<Ringtone> search(final int start, final int num, final String searchString) {
if ( searchString == null ) {
//DECIDE WHAT YOU WANT TO DO, EITHER:
return null;
// OR YOU CAN RETURN AN EMPTY ARRAY
return new ArrayList<Ringtone>();
}
// You should check for these (change according to your rules)
if (start < 0 ) {
start = 0; // protect yourself from bad data.
}
if ( num < 0 ) {
num = 0;
}
/// THE REST OF YOUR search FUNCTION
return <your array>
}现在,另一件事是,您可能希望搜索返回增量结果(因此您可以将它们添加到您的数组中(而不是每次返回一个新数组)。为此,就像前面提到的那样,使用addAll技巧,但是不要返回null,返回一个新的空数组,这样如果没有其他添加,就不会造成伤害。
https://stackoverflow.com/questions/19714846
复制相似问题