How to parse JSON Array inside another JSON Array and display the Clicked item

谁都会走 提交于 2019-11-28 12:30:40

问题


hello i have this Json Data a link

and i parsing it like that

when i click into the image i want to parsing the JsonArray for the image to piccaso in recycler view like this ,

but i get all image like this picture

how i can solve this problem and get just the images for the item which i clicked ???

this is my module :

public class AppShowModule
 {
private List<String> Allimage = new ArrayList<String>();
public List<String> getAllimage() {
    return Allimage;}
public void setAllimage(List<String> allimage) {
    Allimage = allimage;}

this is my Fragment

public class ImageListFragment extends Fragment {

List<AppShowModule> appShowModules;
List<AppShowModule> imagesModule;
RecyclerView AppRecyclerView;
RecyclerView.Adapter imageRecyclerViewadapter;
List<String> imageUrls;
String feedKey = "feed";
String entryKey = "entry";
String imageKey = "im:image";
String labelKey = "label";
String jsonUrl = "https://itunes.apple.com/jo/rss/topfreeapplications/limit=50/json";
RequestQueue requestQueue;
private RecyclerView.LayoutManager mLayoutManager;
public ImageListFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_image_list, container, false);
}
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    AppRecyclerView = (RecyclerView) getView().findViewById(R.id.imageRecyclerView);
    imagesModule = new ArrayList<>();
    appShowModules = new ArrayList<>();
    imageUrls = new ArrayList<>();
    JsonAppShowData();
}
public void JsonAppShowData() {
    final JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( jsonUrl, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray jsonArray = response.getJSONObject(feedKey).getJSONArray( entryKey );
                AppShowModule appShowModule = new AppShowModule();
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONArray imageArray = response.getJSONObject(feedKey).getJSONArray(entryKey).getJSONObject(i).getJSONArray(imageKey);
                    for (int j = 0; j < imageArray.length(); j++) {
                        String image = imageArray.getJSONObject(j).getString(labelKey).toString();
                        imageUrls.add(image);
                        appShowModule.setAllimage(imageUrls);
                        appShowModules.add(appShowModule);}}
                imageRecyclerViewadapter = new ImageListAdapter(appShowModules,getContext(),imageUrls);
                AppRecyclerView.setAdapter(imageRecyclerViewadapter);
            } catch (JSONException e) {
                e.printStackTrace();
            }}
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e( "LOG", error.toString() );
        }
    } );
    requestQueue = Volley.newRequestQueue( getContext() );
    requestQueue.add(jsonObjectRequest);
    mLayoutManager = new GridLayoutManager( getContext().getApplicationContext(),3);
    AppRecyclerView.setLayoutManager(mLayoutManager);    }}

and this is the Recycler adapter

public class ImageListAdapter extends RecyclerView.Adapter<ImageListAdapter.ViewHolder> {
List<AppShowModule> appShowModules;
List<String> imageUrl;


Context context;
public ImageListAdapter(List<AppShowModule> appShowModules, Context context ,List<String>imageUrls
){
    super();
    this.imageUrl =imageUrls;
    this.appShowModules = appShowModules;
    this.context = context;}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from( parent.getContext() ).inflate( R.layout.imagelayout, parent,false );
    ViewHolder viewHolder = new ViewHolder( v );
    return viewHolder;}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    Picasso.with(context).load(imageUrl.get(position)).into(holder.appImage);
}
public int getItemCount() {
    return imageUrl.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
    public ImageView appImage;
    public ViewHolder(View itemView) {
        super(itemView);
        appImage = (ImageView) itemView.findViewById( R.id.appImage);


    }}}

and this is the activity that have the image view where click

public class ListViewDetailsFragment extends Fragment {
ImageView AppImage;
TextView AppName,AppArtist,AppContentType,AppRights,AppCategory,AppRealseDate,AppSammary;
ImageButton AppLink;
Context context;
public ListViewDetailsFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_list_view_details, container, false);}
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    AppImage = (ImageView) getView().findViewById(R.id.imageView);
    AppName = (TextView) getView().findViewById(R.id.textname);
    AppArtist = (TextView) getView().findViewById(R.id.textartest);
    AppContentType = (TextView) getView().findViewById(R.id.textcontent);
    AppRights = (TextView) getView().findViewById(R.id.textrights);
    AppCategory = (TextView) getView().findViewById(R.id.textCategory);
    AppRealseDate = (TextView) getView().findViewById(R.id.textRelease);
    AppSammary = (TextView) getView().findViewById(R.id.textSummary);
    AppLink = (ImageButton) getView().findViewById(R.id.imageButton);
    String name = getActivity().getIntent().getExtras().getString("App_name");
    final String image = getActivity().getIntent().getExtras().getString("App_image");
    String artist = getActivity().getIntent().getExtras().getString("App_artist");
    String contentType = getActivity().getIntent().getExtras().getString("App_ContentType");
    String rights = getActivity().getIntent().getExtras().getString("App_Rights");
    String category = getActivity().getIntent().getExtras().getString("App_Category");
    String realse = getActivity().getIntent().getExtras().getString("App_ReleaseDate");
    final String link = getActivity().getIntent().getExtras().getString("App_link");
    String sammary = getActivity().getIntent().getExtras().getString("App_summary");
    AppName.setText(name);
    AppArtist.setText(artist);
    AppContentType.setText(contentType);
    AppRights.setText(rights);
    AppCategory.setText(category);
    AppRealseDate.setText(realse);
    AppSammary.setText(sammary);
    Picasso.with(context).load(image).into(AppImage);
    AppLink.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(getActivity().getBaseContext(),
                    WebView.class);
            intent.putExtra("App_link", link);
            getActivity().startActivity(intent);}});
    AppImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String id = (String) view.getTag();
            Intent intent = new Intent(getActivity().getBaseContext(), ImageList.class);
            intent.putExtra("id", id);
            getActivity().startActivity(intent);
        }});}}

回答1:


The json data has links to three different sized images, it looks to me like you are requesting that all three images are fetched. If you don't want all three, just select the size you want (index 0, 1 or 2) and pull that image only.

JSONArray imageArray = response.getJSONObject(feedKey).getJSONArray(entryKey).getJSONObject(i).getJSONArray(imageKey);
for (int j = 0; j < imageArray.length(); j++) {
   String image = imageArray.getJSONObject(j).getString(labelKey).toString();
   imageUrls.add(image);
   ...
}

Sample Data:

"im:image":[  
               {  
                  "label":"http://is1.mzstatic.com/image/thumb/Purple20/v4/87/35/82/87358231-ce91-3d14-b306-95888c23db3c/mzl.gdgtivnk.png/53x53bb-85.png",
                  "attributes":{  
                     "height":"53"
                  }
               },
               {  
                  "label":"http://is5.mzstatic.com/image/thumb/Purple20/v4/87/35/82/87358231-ce91-3d14-b306-95888c23db3c/mzl.gdgtivnk.png/75x75bb-85.png",
                  "attributes":{  
                     "height":"75"
                  }
               },
               {  
                  "label":"http://is3.mzstatic.com/image/thumb/Purple20/v4/87/35/82/87358231-ce91-3d14-b306-95888c23db3c/mzl.gdgtivnk.png/100x100bb-85.png",
                  "attributes":{  
                     "height":"100"
                  }
               }

Update 9/13/2016

Based on what I think you are after, I still think your problem is in your nested for loop in the jsonAppShowData() method. Though you do appear to pass some sort of ID extra in from the previous activity, I don't see you filtering on that item ID anywhere in the for loop. You need to restrict the outer for loop to only the item you wish to show.

For the image scaling issue, it may either be how your layout is setup or you can try some of the Picasso resize calls.



来源:https://stackoverflow.com/questions/39454844/how-to-parse-json-array-inside-another-json-array-and-display-the-clicked-item

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!