Android:如何以适当的方式实现PullToRefreshListView

时间:2013-05-13 02:14:26

标签: android performance

我是Android新手,目前开始学习如何使用这个chrisbanes库来实现PullToRefreshListview。你们可以向我解释一下,我应该把我的代码放在哪里调用API来获取数据,以及在我从API获取数据(图像URL)之后我应该设置哪个部分(ImageBitmap)。据我所知,我们应该在后台做一些事情以避免在将图像加载到UI时冻结UI,但我不确定。请帮忙。

以下是来自库的示例代码: 请向我解释我应该在GetDataTask和onPostExecute中做什么。在加载图像的情况下。

@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
    // Do work to refresh the list here.
    new GetDataTask().execute();
}

private class GetDataTask extends AsyncTask<Void, Void, String[]> {

    @Override
    protected String[] doInBackground(Void... params) {
        // Simulates a background job.
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
        }
        return mStrings;
    }

    @Override
    protected void onPostExecute(String[] result) {
        mListItems.addFirst("Added after refresh...");
        mAdapter.notifyDataSetChanged();

        // Call onRefreshComplete when the list has been refreshed.
        mPullRefreshListView.onRefreshComplete();

        super.onPostExecute(result);
    }
}

很抱歉新手问题,我想确认它是为了遵循标准。抱歉我的英文不好

2 个答案:

答案 0 :(得分:0)

我认为你应该将GetDataTask放在一个带有Listener的独立类中。这是您可以拥有的监听器示例:

public abstract class RemoteCallListener implements IRemoteCallListener {

@Override
public abstract void onString(String s); //String is just an example.

@Override
public abstract void onError(Exception e);
}

如果您的异步任务,您应该将监听器提供给您的构造函数。

private class GetDataTask extends AsyncTask<Void, Void, String[]> {

RemoteCallListener listener;
public GetDataTask(){

}

public GetDataTask(RemoteCallListener listener){
this.listener = listener;
}

@Override
protected String[] doInBackground(Void... params) {
    // Simulates a background job.
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
    }
    return mStrings;
}

@Override
protected void onPostExecute(String[] result) {
listener.onString(result);
    // mListItems.addFirst("Added after refresh...");
    // mAdapter.notifyDataSetChanged();

    // Call onRefreshComplete when the list has been refreshed.
    // mPullRefreshListView.onRefreshComplete();

    super.onPostExecute(result);
    }
}

要制作通话实例,您应该执行类似

的操作
 GetDataTask task = new GetDataTask(yourlistener);
 task.execute("your link");

在你的'controller'类中,你应该创建一个RemoteCallListener实例,并在调用onString时:

   mListItems.addFirst("Added after refresh...");
    mAdapter.notifyDataSetChanged();

    // Call onRefreshComplete when the list has been refreshed.
    mPullRefreshListView.onRefreshComplete();

你也可以通过android的Dialogs类来冻结UI。这里给出一个例子:

public final static ProgressDialog showLoading(Context c, String title,
        String message, boolean indeterminate) {
    ProgressDialog p = new ProgressDialog(c);
    p.setTitle(title);
    p.setMessage(message);
    p.setCancelable(false);
    p.setIndeterminate(indeterminate);
    if (!indeterminate) {
        // p.setProgressDrawable( c.getResources().getDrawable(
        // R.drawable.progress ) );
        p.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        p.setProgress(0);
        p.setMax(100);
    }
    p.show();
    return p;
}

但别忘了关闭你的对话!

如果您有其他问题,可以随时与我联系

答案 1 :(得分:0)

GetDataTask用于再次调用您的Web服务以获取新的列表项。这些事情应该在doInBackground中完成。获得新列表项后,需要在onPostExecute中为列表视图设置新适配器。