JSON 数据未串行检索到 RecyclerView
JSON Data is not retrieved serially to RecyclerView
当第一次打开我的应用程序时,它显示 1-5 或 7 是连续的。然后,我滚动我的 Recyclerview 它随机显示该项目。
这是主要的 json link : http://services.hanselandpetal.com/feeds/flowers.json
查看图片了解更多详情
第一次打开时
当我滚动时
MainActivity.class
public class MainActivity extends AppCompatActivity {
String BASE_URL= "http://services.hanselandpetal.com/";
List<Example> examples=new ArrayList<>();
AdapterClass adapterClass;
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.recylerView_ID);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getApplicationContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiCall apiCall=retrofit.create(ApiCall.class);
final Call<List<Example>> exampleCall=apiCall.getData();
exampleCall.enqueue(new Callback<List<Example>>() {
@Override
public void onResponse(Call<List<Example>> call, Response<List<Example>> response) {
if (response.code()==200){
examples=response.body();
adapterClass=new AdapterClass(MainActivity.this,examples);
recyclerView.setAdapter(adapterClass);}
}
@Override
public void onFailure(Call<List<Example>> call, Throwable t) {
}
});
}
}
AdapterClass.class
public class AdapterClass extends RecyclerView.Adapter<AdapterClass.viewModel> {
TextView name;
TextView catagory;
TextView count;
ImageView imageView;
List<Example>examples;
Context context;
public AdapterClass(Context context, List<Example> examples) {
this.context=context;
this.examples = examples;
Toast.makeText(context, ""+examples.size(), Toast.LENGTH_SHORT).show();
}
@NonNull
@Override
public viewModel onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater layoutInflater=LayoutInflater.from(context);
View view=layoutInflater.inflate(R.layout.item_view,null);
return new viewModel(view);
}
@Override
public void onBindViewHolder(@NonNull viewModel viewModel, int i) {
name.setText(examples.get(i).getName());
catagory.setText(examples.get(i).getCategory());
count.setText(String.valueOf(examples.get(i).getProductId()));
String image_url = "http://services.hanselandpetal.com/photos/"+examples.get(i).getPhoto();
Picasso.get().load(image_url).resize(50,50).centerCrop().into(imageView);
}
@Override
public int getItemCount() {
return examples.size();
}
public class viewModel extends RecyclerView.ViewHolder {
public viewModel(@NonNull View itemView) {
super(itemView);
name=itemView.findViewById(R.id.name_TV);
catagory=itemView.findViewById(R.id.catagory_TV);
count=itemView.findViewById(R.id.serial_number_TV);
imageView=itemView.findViewById(R.id.imageView_ID);
}
}
}
我该如何解决这个问题?谢谢。
使用这个
@NonNull
@Override
public viewModel onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater layoutInflater=LayoutInflater.from(context);
View view=layoutInflater.inflate(R.layout.item_view,viewGroup,false);
return new viewModel(view);
}
而不是这个
@NonNull
@Override
public viewModel onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater layoutInflater=LayoutInflater.from(context);
View view=layoutInflater.inflate(R.layout.item_view,null);
return new viewModel(view);
}
有关详细信息,请阅读文档
public View inflate (XmlPullParser parser,
ViewGroup root,
boolean attachToRoot)
- 从指定的 XML 节点扩充新的视图层次结构。如果有错误则抛出 InflateException。
Parameters
parser
XmlPullParser
: XML dom 包含视图层次结构描述的节点。
root
ViewGroup
:可选视图作为生成的层次结构的父视图(如果 attachToRoot 为真),或者只是一个为返回的根提供一组 LayoutParams 值的对象层次结构(如果 attachToRoot 为假。)
此值可能为空。
attachToRoot
boolean
: 是否应该将膨胀的层次结构附加到根参数?如果为 false,root 仅用于为 XML. 中的根视图创建正确的 LayoutParams 子类
也改变你的onBindViewHolder
@Override
public void onBindViewHolder(@NonNull viewModel viewModel, int i) {
viewModel.name.setText(examples.get(i).getName());
viewModel.catagory.setText(examples.get(i).getCategory());
viewModel.count.setText(String.valueOf(examples.get(i).getProductId()));
String image_url = "http://services.hanselandpetal.com/photos/"+examples.get(i).getPhoto();
Picasso.get().load(image_url).resize(50,50).centerCrop().into(viewModel.imageView);
}
要使用 viewholder 模式,您应该在 viewholder class 中定义控件,并通过传递给 onBindViewHoler()
的对象访问它
你的 view holder class 应该像
public class viewModel extends RecyclerView.ViewHolder {
TextView name;
TextView catagory;
TextView count;
ImageView imageView;
public viewModel(@NonNull View itemView) {
super(itemView);
name=itemView.findViewById(R.id.name_TV);
catagory=itemView.findViewById(R.id.catagory_TV);
count=itemView.findViewById(R.id.serial_number_TV);
imageView=itemView.findViewById(R.id.imageView_ID);
}
}
现在 onBindViewHolder()
使用
@Override
public void onBindViewHolder(@NonNull viewModel vh, int i) {
vh.name.setText(examples.get(vh.getAdapterPosition()).getName());
vh.catagory.setText(examples.get(vh.getAdapterPosition()).getCategory());
vh.count.setText(String.valueOf(examples.get(vh.getAdapterPosition()).getProductId()));
String image_url = "http://services.hanselandpetal.com/photos/"+examples.get(vh.getAdapterPosition()).getPhoto();
Picasso.get().load(image_url).resize(50,50).centerCrop().into(vh.imageView);
}
在 NestedScrollView 中设置您的 recyclerview,并在 recyclerview 中添加属性
nestedScrollingEnabled = false;
当第一次打开我的应用程序时,它显示 1-5 或 7 是连续的。然后,我滚动我的 Recyclerview 它随机显示该项目。 这是主要的 json link : http://services.hanselandpetal.com/feeds/flowers.json
查看图片了解更多详情
第一次打开时
当我滚动时
MainActivity.class
public class MainActivity extends AppCompatActivity {
String BASE_URL= "http://services.hanselandpetal.com/";
List<Example> examples=new ArrayList<>();
AdapterClass adapterClass;
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.recylerView_ID);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getApplicationContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiCall apiCall=retrofit.create(ApiCall.class);
final Call<List<Example>> exampleCall=apiCall.getData();
exampleCall.enqueue(new Callback<List<Example>>() {
@Override
public void onResponse(Call<List<Example>> call, Response<List<Example>> response) {
if (response.code()==200){
examples=response.body();
adapterClass=new AdapterClass(MainActivity.this,examples);
recyclerView.setAdapter(adapterClass);}
}
@Override
public void onFailure(Call<List<Example>> call, Throwable t) {
}
});
}
}
AdapterClass.class
public class AdapterClass extends RecyclerView.Adapter<AdapterClass.viewModel> {
TextView name;
TextView catagory;
TextView count;
ImageView imageView;
List<Example>examples;
Context context;
public AdapterClass(Context context, List<Example> examples) {
this.context=context;
this.examples = examples;
Toast.makeText(context, ""+examples.size(), Toast.LENGTH_SHORT).show();
}
@NonNull
@Override
public viewModel onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater layoutInflater=LayoutInflater.from(context);
View view=layoutInflater.inflate(R.layout.item_view,null);
return new viewModel(view);
}
@Override
public void onBindViewHolder(@NonNull viewModel viewModel, int i) {
name.setText(examples.get(i).getName());
catagory.setText(examples.get(i).getCategory());
count.setText(String.valueOf(examples.get(i).getProductId()));
String image_url = "http://services.hanselandpetal.com/photos/"+examples.get(i).getPhoto();
Picasso.get().load(image_url).resize(50,50).centerCrop().into(imageView);
}
@Override
public int getItemCount() {
return examples.size();
}
public class viewModel extends RecyclerView.ViewHolder {
public viewModel(@NonNull View itemView) {
super(itemView);
name=itemView.findViewById(R.id.name_TV);
catagory=itemView.findViewById(R.id.catagory_TV);
count=itemView.findViewById(R.id.serial_number_TV);
imageView=itemView.findViewById(R.id.imageView_ID);
}
}
}
我该如何解决这个问题?谢谢。
使用这个
@NonNull
@Override
public viewModel onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater layoutInflater=LayoutInflater.from(context);
View view=layoutInflater.inflate(R.layout.item_view,viewGroup,false);
return new viewModel(view);
}
而不是这个
@NonNull
@Override
public viewModel onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater layoutInflater=LayoutInflater.from(context);
View view=layoutInflater.inflate(R.layout.item_view,null);
return new viewModel(view);
}
有关详细信息,请阅读文档
public View inflate (XmlPullParser parser,
ViewGroup root,
boolean attachToRoot)
- 从指定的 XML 节点扩充新的视图层次结构。如果有错误则抛出 InflateException。
Parameters
parser
XmlPullParser
: XML dom 包含视图层次结构描述的节点。
root
ViewGroup
:可选视图作为生成的层次结构的父视图(如果 attachToRoot 为真),或者只是一个为返回的根提供一组 LayoutParams 值的对象层次结构(如果 attachToRoot 为假。)此值可能为空。
attachToRoot
boolean
: 是否应该将膨胀的层次结构附加到根参数?如果为 false,root 仅用于为 XML. 中的根视图创建正确的 LayoutParams 子类
也改变你的onBindViewHolder
@Override
public void onBindViewHolder(@NonNull viewModel viewModel, int i) {
viewModel.name.setText(examples.get(i).getName());
viewModel.catagory.setText(examples.get(i).getCategory());
viewModel.count.setText(String.valueOf(examples.get(i).getProductId()));
String image_url = "http://services.hanselandpetal.com/photos/"+examples.get(i).getPhoto();
Picasso.get().load(image_url).resize(50,50).centerCrop().into(viewModel.imageView);
}
要使用 viewholder 模式,您应该在 viewholder class 中定义控件,并通过传递给 onBindViewHoler()
你的 view holder class 应该像
public class viewModel extends RecyclerView.ViewHolder {
TextView name;
TextView catagory;
TextView count;
ImageView imageView;
public viewModel(@NonNull View itemView) {
super(itemView);
name=itemView.findViewById(R.id.name_TV);
catagory=itemView.findViewById(R.id.catagory_TV);
count=itemView.findViewById(R.id.serial_number_TV);
imageView=itemView.findViewById(R.id.imageView_ID);
}
}
现在 onBindViewHolder()
使用
@Override
public void onBindViewHolder(@NonNull viewModel vh, int i) {
vh.name.setText(examples.get(vh.getAdapterPosition()).getName());
vh.catagory.setText(examples.get(vh.getAdapterPosition()).getCategory());
vh.count.setText(String.valueOf(examples.get(vh.getAdapterPosition()).getProductId()));
String image_url = "http://services.hanselandpetal.com/photos/"+examples.get(vh.getAdapterPosition()).getPhoto();
Picasso.get().load(image_url).resize(50,50).centerCrop().into(vh.imageView);
}
在 NestedScrollView 中设置您的 recyclerview,并在 recyclerview 中添加属性 nestedScrollingEnabled = false;