ViewPager无法从服务器获取图像

时间:2019-03-08 05:49:04

标签: java android json server android-viewpager

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

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

这是我的代码:

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

2 个答案:

答案 0 :(得分:2)

在For循环中,您每次都在初始化列表

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<>();  // THIS IS WRONG. don't initialise every time 
            myList.add(String.valueOf(get)); // THIS IS ALSO WRONG. you are adding hashmap object to list
        } 

因此使您的for循环如此

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

答案 1 :(得分:2)

showList()中使用此代码,因为您没有在数组列表中正确填充数据,而某个位置的数据正在被覆盖。

因此,您需要做的是将其初始化为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;