【问题标题】:Chris Banes PullToRefreshListView with Custom Adapter ErrorChris Banes PullToRefreshListView 自定义适配器错误
【发布时间】:2013-07-07 20:54:08
【问题描述】:

我正在设置自定义 ListView。

下拉刷新功能直接来自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(要从 Web 加载的图像的 URL)并在适配器上调用 notifyDataSetChanged。

在 mListView.onRefresh() 中,我将图像添加到 mValues。

这对于添加第一个图像,甚至是第一组图像(在调用 mAdapter.notifyDataSetChanged() 之前)非常有效。 刷新指示器按预期显示和隐藏。

之后,当我尝试添加另一个图像(或一堆)时,奇怪的事情开始发生。

刷新指示器显示,图像显示在列表视图中。

但是:刷新指示器在那之后再也不会隐藏了。 “onRefreshComplete()”被调用,但第二次似乎无法正常工作。

UI 线程没有阻塞,所以仍然可以操作。 如果我删除mValues中的所有项目,通知适配器并再次拉动刷新,图像添加正确,刷新指示器正确隐藏。

结论:只有在刷新前列表为空时,下拉刷新才会正确隐藏。

我真的不知道在哪里寻找这个奇怪错误的解决方案。

也许熟悉 Chirs Banes 的 Pull-To-Refresh Library 的人可以在这里帮助我。

谢谢!

【问题讨论】:

    标签: android android-listview android-adapter custom-adapter pull-to-refresh


    【解决方案1】:

    我自己想通了-.-

    对于任何感兴趣的人:

    您必须从 UI 线程设置 onRefreshComplete。 使用处理程序从 onRefresh() 内部 .post 。

    祝你有美好的一天。

    【讨论】:

    • 请详细说明。代码 sn -p 将是最好的帮助
    • 嘿@Cabus - 你能帮我解决sn-p吗?我遇到了同样的问题,但 onRefreshComplete() 没有帮助。我有我的问题-stackoverflow.com/questions/22908085/…
    • 谢谢!如果有人正在寻找 sn-p,请考虑这个: new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { pullToRefreshListView.onRefreshComplete(); } });跨度>
    【解决方案2】:

    我找到了两种方法:

    1. 动态地,当你需要 pulltorefreshview 停止 do task on pull up 时,你可以设置一个自定义的 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);
              }
      }
      
    2. 动态调用setMode到pulltorefreshView

      ptrlv.setMode(Mode.Both); // both direction can be used
      ptrlv.setMpde(Mode.PULL_FROM_START); // only pull down can be used.
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      相关资源
      最近更新 更多