java - 在 Android 中使用带有 Volley 的 AndroidViewModel 在 RecyclerView 中未设置数据
问题描述
我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);
推荐阅读
- php - 如何使用 Nikic/PHPParser 获取变量值
- git - .gitcredentials 与 .git-credentials
- javascript - CSS样式不操纵JS渲染图像
- javascript - 如何将 html 表单数据映射到包含复合键的 Spring Boot 模型?
- c# - 如何在别人的计算机上运行我的 c# 控制台应用程序
- laravel - 函数redirectTo中的角色重定向问题
- kubernetes-ingress - 允许 Azure 应用程序网关路由 AKS 中的所有子路径
- java - Assertj:如何按对象内容比较 2 个对象列表?
- python-3.x - 输出表中的数字。Python
- arrays - 通过 profile.education 数组映射时,.map 未定义