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

有关详细信息,请阅读文档

inflate

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;