简体   繁体   中英

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.

This is my xml File.

<?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

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. I use Volley JSON to do it. Then i passed this images to PagerAdapter class using viewpager.

PagerAdapter 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.

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.

viewPager.setAdapter(adapter);

And remove it from onCreate because it is not necessary.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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