从jsonArray到Picasso的显示图像错误 [英] error in display image from jsonArray to Picasso

查看:158
本文介绍了从jsonArray到Picasso的显示图像错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个JSON 链接,我对此进行了解析

I have this JSON link and I parsed it.

但是当我单击任何项​​目时,我都会得到所有图像.

But when I click on any item I get all the images.

我想要的是,当用户单击某个项目时,我只想查看所单击项目的详细信息. 例如,当我单击imo时,只需要imo的图像.

What I want is, when user clicks on an item, I want to see the details of only the item clicked. For example, when I click on imo, I need only the image for imo.

我该如何解决这个问题?

How can I solve this problem?

这是我的模块:

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

这是我的片段

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

这是回收站适配器,

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

List<String> imageUrl;
AppShowModule appShowModule;
String x;
Context context;
private OnItemClickListener callback;




public ImageListAdapter(List<AppShowModule> appShowModules, Context context ,List<String>imageUrls, OnItemClickListener callback){
    super();
    this.imageUrl =imageUrls;
    this.appShowModules = appShowModules;
    this.context = context;
    this.callback = callback;
}

@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) {
    holder.setClickListerner(imageUrl.get(position), callback);

}

public int getItemCount() {
    return imageUrl.size();
}

class ViewHolder extends RecyclerView.ViewHolder {


    public ImageView appImage;

    public void setClickListerner(final String item, final OnItemClickListener callback){
        parent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callback.onItemClick(item);
            }
        });
    }

    public ViewHolder(View itemView) {
        super(itemView);
        appImage = (ImageView) itemView.findViewById(R.id.appImage);
        appImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context, ImageShow.class);
                intent.putExtra("image", x);
                context.startActivity(intent);
            }
        });}}

public interface OnItemClickListener {
    void onItemClick(String item);
}
}

这是具有图像视图的活动,单击

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

这是图像布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"

android:id="@+id/card">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/lnrLayout"
    android:orientation="vertical">
    <ImageView
        android:layout_margin="4dp"
        android:scaleType="centerCrop"
        android:id="@+id/appImage"
        android:layout_width="100dp"
        android:background="@android:color/darker_gray"
        android:padding="2dp"
        android:layout_height="100dp" />

</LinearLayout>

推荐答案

创建如下接口类:

public interface OnItemClickListener {
   void onItemClick(String item); 
}

并在 ImageListFragment 中实现此类.

public class ImageListFragment extends Fragment implements OnItemClickListener {

现在,当您在 ImageListFragment 中创建适配器对象时,请更改代码

Now when you are creating your adapter object inside ImageListFragment, change your code

imageRecyclerViewadapter = new ImageListAdapter(appShowModules,getContext(),imageUrls);

imageRecyclerViewadapter = new ImageListAdapter(appShowModules,getContext(),imageUrls, ImageListFragment.this);

在您的适配器类中,将构造函数更改为

and inside your adapter class, change constructor to

public ImageListAdapter(List<AppShowModule> appShowModules, Context context ,List<String>imageUrls, OnItemClickListener callback){
super();
this.imageUrl =imageUrls;
this.appShowModules = appShowModules;
this.context = context;
this.callback = callback;
}

在您的适配器中,您必须再写一行,这是

in your adapter you have to write one more line, which is

private OnItemClickListener callback;

现在在适配器的 onBindViewHolder 中,写

holder.setClickListerner(imageUrl.get(position), callback);

并在 ViewHolder 类中创建类似

public void setClickListerner(String item, OnItemClickListener callback){
parent.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    callback.onItemClick(item);
                }
            });

现在您拥有这样的ViewHolder

Now you have ViewHolder like this

class ViewHolder extends RecyclerView.ViewHolder {

public ImageView appImage;
public LinearLayout parent;

public void setClickListerner(final String item, final OnItemClickListener callback){
    parent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            callback.onItemClick(item);
        }
    });
}

public ViewHolder(View itemView) {
    super(itemView);

    appImage = (ImageView) itemView.findViewById(R.id.appImage);
    parent = (LinearLayout) itemView.findViewById(R.id.lnrLayout);

    appImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(context, ImageShow.class);
            intent.putExtra("image", x);
            context.startActivity(intent);
        }
    });
}

}

现在,当您在Fragment类中单击任何项​​目 onItemClick 时,您便可以选择图像.

Now when you click any item onItemClick inside your Fragment class give you select image.

这篇关于从jsonArray到Picasso的显示图像错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆