java - ViewPager 未从服务器获取图像

标签 java android json server android-viewpager

我在我的应用程序中使用 ViewPager 并从服务器获取数据(图像)(使用 JSON)。即使运行顺利, View 页面中也不会显示任何图像。

我读了很多关于此的教程,但没有人解决我的问题。请告诉我哪里错了...

这是我的代码:

view_pager.xml

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="40dp" />

image_view.xml

<ImageView
    android:id="@+id/image_adapter"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"/>

ViewPager_Adapter.java

public class ViewPager_Adapter extends PagerAdapter {

private String urls;
private LayoutInflater inflater;
private Context context;
ArrayList<String> mylist;

public ViewPager_Adapter(Context context, ArrayList<String> mylist) {
    this.context = context;
    this.urls = urls;
    this.mylist = mylist;
    inflater = LayoutInflater.from(context);
}

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

@Override
public int getCount() {
    return mylist.size();
}

@Override
public Object instantiateItem(ViewGroup view, int position) {
    View imageLayout = inflater.inflate(R.layout.image_view, null);
    assert imageLayout != null;
    final ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image_adapter);

    Glide.with(context)
            .load(mylist.get(position))               
            .into(imageView);
    view.addView(imageLayout,0);
    return imageLayout;
}

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

@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}

@Override
public Parcelable saveState() {
    return null;
}
}

View_Pager.Java

public class View_Pager extends Fragment {
private static ViewPager mPager;
JSONArray responsearray = null;
String imageOne;
private static final String TAG_PHOTO_ONE = "Gallery_Full";
ArrayList<String> myList;
HashMap<String, String> get;
ViewPager_Adapter viewpager_adapter;
LinearLayout addimages;
int REQUEST_CODE = 100;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.view_pager, null);      
    mPager = view.findViewById(R.id.viewpager);      

    new GetImages().execute(true);

           return view;
}

class GetImages extends AsyncTask<Boolean, Void, String> {

    @Override
    protected String doInBackground(Boolean... booleans) {
        ImageApi imageApi = new ImageApi();
        String result = null;
        try {
            result = imageApi.galleryget(sharedPreferences.getString("id", ""));
            JSONObject object = new JSONObject(result);
            if (object.getString("error").equalsIgnoreCase("false")) {
                responsearray = object.getJSONArray("response");
                return "true";
            } else {
                String errormsg = object.getString(result);
                return errormsg;
            }
        } catch (ApiException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        if (s != null) {
            if (s.equalsIgnoreCase("true")) {
                showList(responsearray);
            }
        }
    }
}

public void showList(final JSONArray responsearray) {
    try {
        for (int i = 0; i < responsearray.length(); i++) {
            JSONObject responseObject = responsearray.getJSONObject(i);
            Log.e("COUNT" + i, String.valueOf(responseObject));
            imageOne = responseObject.getString(TAG_PHOTO_ONE);                
            get = new HashMap<>();
            get.put(TAG_PHOTO_ONE, imageOne);
            myList = new ArrayList<>();
            myList.add(String.valueOf(get));
        }

            viewpager_adapter = new ViewPager_Adapter(getActivity(), myList);
            String test = String.valueOf(myList);
            String imgpath = getString(R.string.imgpath);
            String finalimgpath = imgpath + imageOne;
            Log.e("FINALPATH", finalimgpath);

    } catch (JSONException e) {
        e.printStackTrace();
    }
    mPager.setAdapter(viewpager_adapter);
    viewpager_adapter.notifyDataSetChanged();
}
}

最佳答案

将此代码用于 showList(),因为您没有正确填充 arrayList,数据在一个位置被覆盖。

所以,你要做的就是在 for 循环之外初始化它。

public void showList(final JSONArray responsearray) {
 try {

    //here  
    myList = new ArrayList<>();

    for (int i = 0; i < responsearray.length(); i++) {
        JSONObject responseObject = responsearray.getJSONObject(i);
        Log.e("COUNT" + i, String.valueOf(responseObject));
        imageOne = responseObject.getString(TAG_PHOTO_ONE);                
        get = new HashMap<>();
        get.put(TAG_PHOTO_ONE, imageOne);

        myList.add(String.valueOf(get));
    }

        viewpager_adapter = new ViewPager_Adapter(getActivity(), myList);
        String test = String.valueOf(myList);
        String imgpath = getString(R.string.imgpath);
        String finalimgpath = imgpath + imageOne;
        Log.e("FINALPATH", finalimgpath);

} catch (JSONException e) {
    e.printStackTrace();
}
mPager.setAdapter(viewpager_adapter);
viewpager_adapter.notifyDataSetChanged();
}

编辑

此外,如果您的最终图像路径如下所示,那么您必须在图像路径适配器中更新代码,如下所示。

也更新 view.addView() 中的位置。

String test = String.valueOf(mylist.get(position));
        String imgpath = getString(R.string.imgpath);
        String finalimgpath = imgpath + test;

Glide.with(context)
        .load(finalimgpath)               
        .into(imageView);
view.addView(imageLayout,position);
return imageLayout;

关于java - ViewPager 未从服务器获取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55057420/

相关文章:

java - 可以以任何方式序列化 transient 变量吗?

java - 实现 Hibernate Search 后 Hibernate Criteria 弃用警告

android - 单击按钮时从 TabActivity 调用已启动 Activity 中的自定义方法

android - 如何在不需要 gmail 的情况下从电子邮件链接到 Android 应用程序?

c# - RestSharp如何处理同一查询的不同JSON响应格式

java - 错误 : "Cannot invoke String() on the primitive type float " on quadratic formula?

Android资源模块化

javascript - d3.js 中的简单条形图

javascript - 复制/重命名 JSON 对象数组

java - Spring Boot - 出现意外错误(类型=错误请求,状态=400)。缺少必需的请求正文