Adapter.notifyDataSetChanged()在onCreate()中不起作用

问题描述 投票:1回答:1

我正在尝试使用Volley解析JSON。

我正在使用向量来存储解析数据,并在填充向量后在adapter.notifyDataSetChanged()中调用onCreate()。但是没有变化。

如果我在adapter.notifyDataSetChanged()try-catch区块内调用getData(),那么它工作正常。为什么?

public class MainActivity extends AppCompatActivity{

    Vector<Data> ve;
    private  Adapter adapter;
    RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView=(RecyclerView)findViewById(R.id.main_recycler_view);
        ve=new Vector<Data>();
        adapter=new Adapter(ve);
        RecyclerView.LayoutManager lm=new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(lm);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);

        getData(ve);
        adapter.notifyDataSetChanged();  //not working
    }
    public void getData(final Vector<Data> ve)
    {
        String url = "https://api.androidhive.info/contacts/";
        StringRequest request = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String jsonString) {
                try
                {
                    JSONObject object = new JSONObject(jsonString);
                    JSONArray arr = object.getJSONArray("contacts");
                    int len=arr.length();
                    JSONObject obj;
                    for (int i = 0; i < len; i++)
                    {
                        obj = arr.getJSONObject(i);
                        ve.add(new Data(obj.getString("name"), obj.getString("email"));

                    }
                   //adapter.notifyDataSetChanged();working
                }
                catch (JSONException e)
                {
                    Toast.makeText(getApplicationContext(),"JSON Parsing Exception",Toast.LENGTH_LONG);
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(getApplicationContext(), "Some error occurred!!", Toast.LENGTH_SHORT).show();

            }
        });
        RequestQueue rQueue = Volley.newRequestQueue(this);
        rQueue.add(request);

    }

}
java android recycler-adapter
1个回答
2
投票

你无法做到这一点,没有任何凌空使用的网络请求本质上是异步的,因此网络请求被放入队列并且代码继续执行notifyadapter改变的方法。之后发生对网络调用的响应并添加数据,你应该通过在响应方法内部调用它来调用它来调用该方法

© www.soinside.com 2019 - 2024. All rights reserved.