从DataStore获取列表数据后,Listview不会自动刷新

时间:2015-12-03 09:36:13

标签: android android-listview

我有一个ListView,我使用DataStore或本地数据库填充数据。

我正在检查一些确定是否从DataStore或数据库中获取数据的条件。当我从数据库中获取时,ListView会自动刷新,但是当我从DataStore中获取时,它不会。然后我必须单击ListView下面的TextView,当我单击它时,会出现软键盘,然后我的ListView将填充来自DataStore的数据。

我的活动有ListView:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_xyz);

    list_View = (ListView) findViewById(R.id.data_listView);
    list_View.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    list_View.setMultiChoiceModeListener(new Selector());

    adapter = new MyAdapter(context,Long.valueOf(id),isOnline());
    list_View.setAdapter(adapter);
    list_View.setSelection(adapter.getCount() - 1);
    adapter.registerDataSetObserver(new DataSetObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            list_View.setSelection(adapter.getCount() - 1);
        }

   LoadDataTask ldt = new LoadDataTask();
    ldt.execute("123456789");
}

 private void loadDataFromDataStore(final Long contactId){
    final ArrayList<Data> data = new ArrayList<>();;
    d("loadingdataFromDatasore");

    GetDataTask task = new GetDataTask(new ApiTask.ResultListener() {
        @Override
        public void successHook(Object o) {
            if (o instanceof GetDataResponse) {
                GetDataResponse res = (GetDataResponse) o;
                if (res.getData() != null && res.getData().getItems() != null) {
                    for (ListDataItem i : res.getData().getItems()) {
                        Data dp = new Data(i.getPosition(), i.getMessage(), i.getDateCreated(),i.getMessageId(),1);
                        adapter.addFromOtherThread(dp);
                    }

                }

                d("Messages loaded from server: " + adapter.getCount());
            }

        }
}

public class LoadDataTask extends AsyncTask<String,String,Void> {
         @Override
    protected  Void doInBackground(String... params){

        if(isOnline && isFirstTime){
         loadDataFromDataStore(Long.valueOf(params[0]));
        }else{
          //load from database
        }

        return null;
    }

 @Override
    protected void onPostExecute(Void v){
        adapter.notifyDataSetChanged();

    }
}

我的扩展BaseAdapter的适配器类(我删除了此问题的不必要代码):

public class DataAdapter extends BaseAdapter {

private ArrayList<Data>data_list;

public DataAdapter(){
    data_list = new ArrayList<>();
}

 public void addFromOtherThread(Data object) {
    data_list.add(object);
}

我错过了什么让listview即使在调用notifyDatasetChanged()后也不会自动刷新自己?

2 个答案:

答案 0 :(得分:2)

改变:

 @Override
    protected void onPostExecute(Void v){
        adapter.notifyDataSetChanged();

    }
}

为:

 @Override
    protected void onPostExecute(Void v){
        adapter.notifyDataSetChanged();
        list_View.setAdapter(adapter);

    }
}

如果需要通过以下评论进行更多说明,请与我们联系。

答案 1 :(得分:1)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xyz);

        list_View = (ListView) findViewById(R.id.data_listView);
        list_View.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        list_View.setMultiChoiceModeListener(new Selector());

        adapter = new MyAdapter(context,Long.valueOf(id),isOnline());
        list_View.setAdapter(adapter);
        list_View.setSelection(adapter.getCount() - 1);
        adapter.registerDataSetObserver(new DataSetObserver() {
            @Override
            public void onChanged() {
                super.onChanged();
                list_View.setSelection(adapter.getCount() - 1);
            }
    loadDataFromDataStore("123456789")

    }

     private void loadDataFromDataStore(final Long contactId){
        final ArrayList<Data> data = new ArrayList<>();;
        d("loadingdataFromDatasore");

        new GetDataTask(new ApiTask.ResultListener() {
            @Override
            public void successHook(Object o) {
                if (o instanceof GetDataResponse) {
                    GetDataResponse res = (GetDataResponse) o;
                    if (res.getData() != null && res.getData().getItems() != null) {
                        for (ListDataItem i : res.getData().getItems()) {
                            Data dp = new Data(i.getPosition(), i.getMessage(), i.getDateCreated(),i.getMessageId(),1);
                            adapter.addFromOtherThread(dp);
                        }

                    }    
                    d("Messages loaded from server: " +      adapter.getCount());
adapter.notifyDatasetChanges();
                }

            }
    }.execute();
}

GetDataTask应该在内部工作,你不需要从这里启动AsyncTask。

如果你想使用AsyncTask,你的AsyncTask应该等待GetDataTask的结果,而不是你的代码实现中的结果。 我不知道你使用哪种框架进行api调用,但你的实现似乎看起来不对。

如果你的GetDataTask是一个AsyncTask或者一些后台处理器,我可以在假设基础上编写代码。