有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么JSON数据无法访问ViewPager?

我想在PagerAdapter for slider中使用截取JSON获取图像,但问题是,使用JSON获取的数据在构造函数之前到达,但并没有重新连接到InstanceItem方法

这是我的xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    xmlns:app="http://schemas.安卓.com/apk/res-auto"
    xmlns:tools="http://schemas.安卓.com/tools"
    安卓:layout_width="match_parent"
    安卓:layout_height="match_parent"
    安卓:orientation="vertical"
    tools:context=".MainActivity">

    <安卓x.viewpager.widget.ViewPager
        安卓:layout_width="match_parent"
        安卓:layout_height="@dimen/_200sdp"
        安卓:id="@+id/view_pager">


    </安卓x.viewpager.widget.ViewPager>

    <TextView
        安卓:layout_width="match_parent"
        安卓:layout_height="@dimen/_50sdp"
        安卓:text="@string/app_name"
        安卓:textSize="@dimen/_30sdp"
        安卓:textColor="@color/colorPrimaryDark"
        安卓:id="@+id/txt"/>
</LinearLayout>

主要活动。java

package com.example.sliderwithvolleyjson;

import 安卓x.appcompat.app.AppCompatActivity;
import 安卓x.viewpager.widget.ViewPager;

import 安卓.os.Bundle;
import 安卓.util.Log;
import 安卓.widget.Toast;

import com.安卓.volley.Request;
import com.安卓.volley.RequestQueue;
import com.安卓.volley.Response;
import com.安卓.volley.VolleyError;
import com.安卓.volley.toolbox.JsonObjectRequest;
import com.安卓.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    ViewPager viewPager;
    String slider_url="Here is my API";
    ArrayList<String> image=new ArrayList<>();
    RequestQueue queue;
    Slider_Adapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        queue= Volley.newRequestQueue(getApplicationContext());
        viewPager=findViewById(R.id.view_pager);
        getImageByJson();
        viewPager.setAdapter(adapter);

    }

    public void getImageByJson(){

        JsonObjectRequest request=new JsonObjectRequest(Request.Method.GET, slider_url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

                try {
                    JSONArray array=response.getJSONArray("slider");

                    for (int i=0;i<array.length();i++){

                        JSONArray jsonData=array.getJSONArray(i);

                        image.add(jsonData.getString(1));

                    }

                    String[] imageUrls=new String[image.size()];
                    imageUrls=image.toArray(imageUrls);

                    for (String s : imageUrls){
                       Log.d("String",s);
                    }
                    adapter=new Slider_Adapter(getApplicationContext(),imageUrls);

                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),String.valueOf(e),Toast.LENGTH_LONG).show();
                    Log.d("ath",String.valueOf(e));
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),String.valueOf(error),Toast.LENGTH_LONG).show();
                Log.d("Error",String.valueOf(error));
            }
        });

        queue.add(request);
    }
}

我使用mainactivity类中的API从服务器获取图像。我使用截击JSON来做这件事。然后我使用viewpager将这些图像传递给PagerAdapter类

PagerAdapter类

package com.example.sliderwithvolleyjson;

import 安卓.content.Context;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.ImageView;
import 安卓.widget.TextView;
import 安卓.widget.Toast;

import 安卓x.annotation.NonNull;
import 安卓x.viewpager.widget.PagerAdapter;
import 安卓x.viewpager.widget.ViewPager;

import com.squareup.picasso.Picasso;

public class Slider_Adapter extends PagerAdapter {

    LayoutInflater inflater;
    private Context context;
    private String[] imageurls;

    public Slider_Adapter(Context context, String[] imageurls) {
        this.context = context;
        this.imageurls = imageurls;
        Toast.makeText(context, String.valueOf(imageurls[1]), Toast.LENGTH_SHORT).show();
    }

    @Override
    public int getCount() {
        return imageurls.length;
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view==object;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View view=inflater.inflate(R.layout.activity_main,container);

        ImageView imageView=new ImageView(container);
        TextView textView=view.findViewById(R.id.txt);
        textView.setText(String.valueOf(imageurls.length));
        Picasso.with(context).load(imageurls[position]).fit().into(imageView);
        ViewPager pager=(ViewPager)container;
        pager.addView(view);
        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View)object);
    }
}

直到构造函数(我尝试使用toast消息)才到达这些图像,但在instanceItem方法和其他函数中找不到这些图像/数据

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    public class MainActivity extends AppCompatActivity {
    
        ViewPager viewPager;
        String slider_url="Here is my API";
        ArrayList<String> image=new ArrayList<>();
        RequestQueue queue;
        Slider_Adapter adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            queue= Volley.newRequestQueue(getApplicationContext());
            viewPager=findViewById(R.id.view_pager);
            getImageByJson();
            
    
        }
    
        public void getImageByJson(){
    
            JsonObjectRequest request=new JsonObjectRequest(Request.Method.GET, slider_url, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
    
                    try {
                        JSONArray array=response.getJSONArray("slider");
    
                        for (int i=0;i<array.length();i++){
    
                            JSONArray jsonData=array.getJSONArray(i);
    
                            image.add(jsonData.getString(1));
    
                        }
    
                        String[] imageUrls=new String[image.size()];
                        imageUrls=image.toArray(imageUrls);
    
                        for (String s : imageUrls){
                           Log.d("String",s);
                        }
                        adapter=new Slider_Adapter(getApplicationContext(),imageUrls);
                        viewPager.setAdapter(adapter);
    
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(getApplicationContext(),String.valueOf(e),Toast.LENGTH_LONG).show();
                        Log.d("ath",String.valueOf(e));
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getApplicationContext(),String.valueOf(error),Toast.LENGTH_LONG).show();
                    Log.d("Error",String.valueOf(error));
                }
            });
    
            queue.add(request);
        }
    }
    
  2. # 2 楼答案

    for (String s : imageUrls){
       Log.d("String",s);
    }
    adapter=new Slider_Adapter(getApplicationContext(),imageUrls);
    

    onResponse方法中的这行代码之后,添加此代码

    viewPager.setAdapter(adapter);
    

    并将其从onCreate中删除,因为它不是必需的