簡體   English   中英

在 Android 中使用 AndroidViewModel 和 Volley 在 RecyclerView 中未設置數據

[英]Data not set in RecyclerView using AndroidViewModel with Volley in Android

我在應用程序中使用AndroidViewModel 。但是當我的應用程序打開時, ViewModel類中的方法沒有被調用,數據也沒有在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 上設置。 如何解決這個問題?

應該

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM