【问题标题】:Why JSON data can't reach ViewPager?为什么 JSON 数据无法到达 ViewPager?
【发布时间】:2020-12-03 19:31:37
【问题描述】:

我想在 PagerAdapter 中为滑块使用 Volley JSON 获取图像,但问题是使用 JSON 获取的数据在构造函数之前到达,但没有重新到达 InstantiateItem 方法。

这是我的 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

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

我使用 mainactivity 类中的 API 从我的服务器获取图像。我使用 Volley JSON 来做到这一点。然后我使用 viewpager 将这些图像传递给 PagerAdapter 类。

PagerAdapter 类

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

直到构造函数才到达图像(我使用 toast 消息进行了尝试),但我们在 InstantiateItem 方法和其他函数中找不到该图像/数据。

提前致谢。

【问题讨论】:

    标签: java android android-viewpager android-volley android-pageradapter


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

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

      viewPager.setAdapter(adapter);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 2022-11-07
        • 2021-01-12
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        相关资源
        最近更新 更多