java - 刷新 android ListView 的最佳方法是什么?

标签 java android listview android-asynctask listadapter

我想在数据库中插入或删除 listView 后刷新它。我已经搜索并找到了 notifyDataSetChanged(),但我不知道如何使用它。

我使用 AsyncTask 从服务器获取数据并将其插入 SQLite 数据库。问题是 AsyncTask 类在另一个文件中。那么如何从 AsyncTask 类访问适配器或 ListView 呢?

有人可以解释一下怎么做吗?甚至通过不同的方式。

这是我的代码:

public class devicesController extends SherlockFragment {

    devicesDataSource deviceDS;
    static devicesAdapter adapter;
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
        View view = inflater.inflate(R.layout.devices, container, false);

        /// Set device's datasource
        deviceDS = new devicesDataSource(getActivity());

        /// Assign the listview from the xml layout
        ListView lv1 = (ListView) view.findViewById(R.id.devicesList);

        /// Getting all devices from the SQLite database
        deviceDS.open();
        List<Devices> allDevices = null;
        try {
            allDevices = deviceDS.getAll();
        } catch (ParseException e) {
            e.printStackTrace();
            Log.i("QUTAYBA", "ERROR showing data");
        }


        /// Set the results rows in a list adapter
        adapter = new devicesAdapter(getActivity(), R.layout.devices_list, allDevices);
        lv1.setAdapter(adapter);

    return view;

    }

AsyncTask 类是:

public class bootstrapTask extends AsyncTask<Void, Void, Void> {
    private static Context thisContext = null;
    static devicesDataSource deviceDS;
    private static devicesAdapter da;


    public bootstrapTask(Context context, devicesAdapter deviceAdapt) {
        thisContext = context;
        deviceDS = new devicesDataSource(thisContext);
        da = deviceAdapt;
    }

    @Override
    protected Void doInBackground(Void... params) {

        String data = dataHelper.checkDataFromServer(thisContext);
        try {
            JSONObject jsonData = new JSONObject(data);
            deviceDS.createFromJsonArray(jsonData.getJSONArray("devices"));

        } catch (JSONException e) {
            Log.i("QUTAYBA", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        //da.notifyDataSetChanged();
        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

    }

    @Override
    protected void onProgressUpdate(Void... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
    }

}

最佳答案

还有一种更好的方法可以在不在异步任务中传递适配器对象的情况下实现您想要的效果。

从您的 onPostExecute() 方法中的异步任务,您可以发送一个 broadcast Intent ,在您的 Activity 中,您可以监听并调用 adapater.notifyDataSetChanged ();onRecieve() 中。

关于java - 刷新 android ListView 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16369870/

相关文章:

java - 在不改变 %C 的情况下子类化 org.apache.log4j.Logger?

android - 如何在android中搜索项目后更新 ListView

python - 有没有人在 pyqt 5 中实现了一种将所选项目从一个 ListView 框移动到另一个 ListView 框的方法?

android - 如何从 NDK 堆栈跟踪中找到导致崩溃的方法

android - 如何在 Android Activity 中垂直滚动

c# - 从 ListView 排序中排除项目

java - 堆大小迅速增加 spring boot 应用程序

java - 任何覆盖更多汉字的 JTextField 后代或替代者?

java - 为什么我的程序没有删除 "all"?

android - 关于 Google Cloud Platform (GCP) API key 的 Google Play 安全警报