JSON数据未串行检索到RecyclerView

时间:2018-11-21 05:43:22

标签: android json android-recyclerview retrofit2 recyclerview-layout

首次打开我的应用时,显示1-5或7的是连续的。然后,我滚动我的Recyclerview,它随机显示该项目。 这是主要的json链接: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);

    }
}
 }

我该如何解决这个问题?谢谢。

3 个答案:

答案 0 :(得分:0)

使用此

@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。
  

参数

parser

  • XmlPullParser:包含视图层次结构描述的XML dom节点。

root

  • ViewGroup:作为生成层次结构的父级的可选视图(如果attachToRoot为true),或者只是一个为返回的层次结构的根提供一组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);
}

答案 1 :(得分:0)

要使用视图持有人模式,您应该在viewholder类内定义控件,并通过传递给onBindViewHoler()的对象访问它

您的视图持有者类应该是

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

答案 2 :(得分:0)

在NestedScrollView中设置您的recyclerview,然后在recyclerview中添加属性 nestedScrollingEnabled = false;