简体   繁体   English

为什么 JSON 数据无法到达 ViewPager?

[英]Why JSON data can't reach ViewPager?

I want to fetch Images using Volley JSON in PagerAdapter for slider, but problem is that data fetched using JSON is reached till constructor but not reatched to InstantiateItem method.我想在 slider 的 PagerAdapter 中使用 Volley JSON 获取图像,但问题是使用 JSON 获取的数据到达构造函数但未重新获取到 InstantiateItem 方法。

This is my xml File.这是我的 xml 文件。

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

    <androidx.viewpager.widget.ViewPager
        android:layout_width="match_parent"
        android:layout_height="@dimen/_200sdp"
        android:id="@+id/view_pager">


    </androidx.viewpager.widget.ViewPager>

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

MainActivity.java MainActivity.java

package com.example.sliderwithvolleyjson;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.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);
    }
}

I fetch images from my server using API in mainactivity class.我在 mainactivity class 中使用 API 从我的服务器获取图像。 I use Volley JSON to do it.我使用 Volley JSON 来做到这一点。 Then i passed this images to PagerAdapter class using viewpager.然后我使用 viewpager 将此图像传递给 PagerAdapter class。

PagerAdapter Class寻呼机适配器 Class

package com.example.sliderwithvolleyjson;

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

import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import androidx.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);
    }
}

That Images is arrived till constructor (I tried it using toast message) but We can't find that images/data in InstantiateItem method and other functions.该图像到达构造函数(我使用 toast 消息尝试过),但我们在 InstantiateItem 方法和其他函数中找不到该图像/数据。

Thanks in Advance.提前致谢。

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);
    }
}
for (String s : imageUrls){
   Log.d("String",s);
}
adapter=new Slider_Adapter(getApplicationContext(),imageUrls);

After this line of codes in your onResponse method, add this code.onResponse方法中的这行代码之后,添加此代码。

viewPager.setAdapter(adapter);

And remove it from onCreate because it is not necessary.并将其从 onCreate 中删除,因为它不是必需的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM