我正在设置自定义列表视图。
拉动刷新功能直接来自https://github.com/chrisbanes/Android-PullToRefresh
ListView显示图像,因此我创建了一个自定义适配器:
class mAdapter extends BaseAdapter{
public mAdapter(Context context){
// nothing to do
}
@Override
public int getCount() {
return mValues.size();
}
@Override
public Object getItem(int position) {
return mValues.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean areAllItemsEnabled()
{
return false;
}
@Override
public boolean isEnabled(int position)
{
return false;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if(v == null){
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.list_item, null);
}
ImageView iv = (ImageView) v.findViewById(R.id.imageView);
if(iv != null){
displayImageInView(iv);
iv.setClickable(true);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "ImageView", Toast.LENGTH_SHORT).show();
}
});
}
return v;
}
}
在onCreate()中,我得到listView并分配适配器:
mListView = (PullToRefreshListView) findViewById(R.id.listView);
mListView.setAdapter(new mAdapter(context));
之后我将图像添加到mValues(图像的url以从web加载)并在适配器上调用notifiyDataSetChanged。
在mListView.onRefresh()中,我将图像添加到mValues。
这可以顺利地添加第一个图像,甚至是第一批图像(在调用mAdapter.notifyDataSetChanged()之前)。 刷新指示器按预期显示和隐藏。
当我尝试在此之后添加另一个图像(或束)时,会发生奇怪的事情。
刷新指示器显示,图像显示在列表视图中。
但是:之后刷新指示器永远不会再隐藏。 “onRefreshComplete()”被调用,但第二次似乎无法正常工作。
UI线程没有阻塞,因此仍然可以进行操作。 如果我删除了mValues中的所有项目,请通知适配器并再次刷新,正确添加图像,并正确隐藏刷新指示。
结论:如果清单之前列表为空,则只有正确的拉取才能正常隐藏。
我真的不知道在哪里寻找这个奇怪错误的解决方案。
也许熟悉Chirs Banes的Pull-To-Refresh图书馆的人可以帮助我。
谢谢!
答案 0 :(得分:8)
我只是想出了自己 - .-
对任何有兴趣的人:
您必须从UI线程设置onRefreshComplete。 使用处理程序从onRefresh()内部.post。 < - 顺便说一句,它运行在一个单独的线程上。
度过愉快的一天。
答案 1 :(得分:1)
我找到了两种方法:
动态地,当你需要pulltorefreshview来停止拉取任务时,你可以设置一个自定义的AsyncTask,例如:
private class GetDataTask extends AsyncTask<Void, Void, String[]> {
@Override
protected String[] doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(String[] result) {
lv.onRefreshComplete();
showToast(getResources().getString(R.string.no_more));
super.onPostExecute(result);
}
}
动态调用setMode
到pulltorefreshView
ptrlv.setMode(Mode.Both); // both direction can be used
ptrlv.setMpde(Mode.PULL_FROM_START); // only pull down can be used.