【问题标题】:Data not set in RecyclerView using AndroidViewModel with Volley in Android在 Android 中使用带有 Volley 的 AndroidViewModel 在 RecyclerView 中未设置数据
【发布时间】:2019-01-05 07:09:26
【问题描述】:

我在应用程序中使用AndroidViewModel。但是当我的应用程序打开时,ViewModelclass 中的方法未被调用并且数据未在RecyclerView 上设置。这是我的模型的代码

class public class Foodie {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}  

这是我的 ViewModel 类的代码,它扩展了AndroidViewModel,以便我可以在我的应用程序中使用Volley

public class FoodieViewModel extends AndroidViewModel {
   public MutableLiveData<Foodie> foodieList;

    public FoodieViewModel(@NonNull Application application) {
        super(application);
    }

    public MutableLiveData<Foodie> getFoodies(){
        if(foodieList==null){
            foodieList=new MutableLiveData<>();
            loadFoodies();
        }
        return foodieList;
    }

    public void loadFoodies(){
        String url="someURL";
        JsonArrayRequest request =new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                try {
                    for(int i=0;i<response.length();i++){
                        JSONObject obj=response.getJSONObject(i);
                        Foodie foodie=new Foodie();
                        String name=obj.getString("firstname");
                        foodie.setName(name);
                        foodieList.setValue(foodie);
                    }

                }catch (JSONException e){
                    e.printStackTrace();
                }


            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();
                String auth ="JWT token";
                headers.put("Authorization", auth);
                headers.put("Content-Type", "application/json");
                return headers;
            }

        };
        AppController.getInstance().addToRequestQueue(request);
    }
}  

这是我的MainActivity 的代码,其中数据在 RecyclerView 中设置

public class MainActivity extends AppCompatActivity {

    ArrayList<Foodie> foodies;
    RecyclerView recyclerView;
    FoodieAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView=(RecyclerView)findViewById(R.id.recyclerview);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        FoodieViewModel model= ViewModelProviders.of(this).get(FoodieViewModel.class);
        model.getFoodies().observe(this, new Observer<Foodie>() {
            @Override
            public void onChanged(@Nullable Foodie foodie) {
                adapter=new FoodieAdapter(foodies,MainActivity.this);
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }
        });
    } 

但是当应用程序打开时,LoadFoodies 方法永远不会被调用,并且数据也不会在 Recyclerview 上设置。如何解决?

【问题讨论】:

    标签: java android-recyclerview android-volley android-architecture-components android-livedata


    【解决方案1】:

    应该是

    public class FoodieViewModel extends AndroidViewModel {
        public MutableLiveData<List<Foodie>> foodieList;
    
        public FoodieViewModel(@NonNull Application application) {
            super(application);
        }
    
        public MutableLiveData<List<Foodie>> getFoodies(){
            if(foodieList==null){
                foodieList=new MutableLiveData<>();
                loadFoodies();
            }
            return foodieList;
        }
    
        public void loadFoodies(){
            String url="someURL";
            JsonArrayRequest request =new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    try {
                        int length = response.length();
                        List<Foodie> list = new ArrayList<>(length);
                        for(int i = 0; i < length; i++){
                            JSONObject obj=response.getJSONObject(i);
                            Foodie foodie = new Foodie();
                            String name = obj.getString("firstname");
                            foodie.setName(name);
                            list.add(foodie);
                        }
                        foodieList.setValue(list);
    

    public class MainActivity extends AppCompatActivity {
    
        // ArrayList<Foodie> foodies;
        RecyclerView recyclerView;
        FoodieAdapter adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            recyclerView=(RecyclerView)findViewById(R.id.recyclerview);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            FoodieViewModel model= ViewModelProviders.of(this).get(FoodieViewModel.class);
            model.getFoodies().observe(this, new Observer<Foodie>() {
                @Override
                public void onChanged(@Nullable List<Foodie> foodies) {
                    adapter=new FoodieAdapter(foodies,MainActivity.this);
    

    【讨论】:

      猜你喜欢
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2018-12-09
      • 2021-11-28
      相关资源
      最近更新 更多