【问题标题】:How do I know any image chosen from recyclerview?我如何知道从 recyclerview 中选择的任何图像?
【发布时间】:2016-09-16 03:58:56
【问题描述】:

你好我有这个json数据a link

我将jsonArray解析成

这是一段json,

"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"
              }
           }

我喜欢这张照片

但是当我点击这里的任何图片时,我只得到了这张图片!

我该如何解决这个问题,当我点击“snapchat”时,我得到了快照的图像?

这是解析json的方法

 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();
            int x = appShowModule.getId();
            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() );
        }
    } );

这是图片列表加载器

public class ImageListAdapter extends RecyclerView.Adapter<ImageListAdapter.ViewHolder> {
    List<AppShowModule> appShowModules;
    List<String> imageUrl;
    AppShowModule appShowModule;
    String x;
    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) {
        AppShowModule appShowModule = appShowModules.get(position);
         x = appShowModule.getAllimage().get(position);
        Picasso.with(context).load(x).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);
            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);
                }});
        }

        }
}

这是点击时将显示的活动

appImage=(ImageView)findViewById(R.id.appImage);
    Picasso.with(context).load(x).into(appImage);

【问题讨论】:

    标签: android json


    【解决方案1】:

    您不能直接在 ViewHolder 中使用变量“x”,因为它不会隐藏所单击项目的图像链接。

    要获得正确的链接,您必须使用 getAdapterPosition()。如果您的点击响应取决于所点击项目的位置,您可以简单地从 ViewHolder 中调用 getAdapterPosition()。下面我已经展示了如何在 ViewHolder 中使用它。

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnItemClickListener {
    public MyViewHolder(View view) {
      super(view);
    
      view.setOnClickListener(this);
    }
    
    @Override
    public void OnClick(View view) {
      // Get the item clicked
      // For this example, I'm assuming your data source is of type `List<MyObject>`
      MyObject myObject = mDataSource.get(getAdapterPosition());
      // Then you can do any actions on it, for example - 
      myObject.setChecked();
       }
    }
    

    【讨论】:

    • 这段代码在 onBindViewHolder 中,我尝试添加 getAdapterPosition());对视图持有者来说,它的含义是不爱!
    【解决方案2】:

    您可以在适配器中为单击的项目定义回调

    public interface OnItemClickListener {
        void onItemClicked(YourItem item);
    }
    

    在你的适配器中为调用片段或活动公开一个方法来设置监听器

     public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }
    

    在绑定 yourviewholder 时,您可以将事件报告回片段或活动并执行业务逻辑

     @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
            //your binding code
            if (onItemClickListener != null) {
              onItemClickListener.onItemClicked(item);
            }
        }
    

    在您的片段或活动中

    adapter.setOnItemClickListener(new YourAdapter.OnItemClickListener() {
                @Override
                public void onItemClicked(YourItem item) {
                    //Business logic goes here
                }
            });
    

    【讨论】:

    • 感谢您的回答,但您的意思是什么?无效 onItemClicked(YourItem item);你的项目??
    • 在你的情况下 AppShowModule 是适配器的“YourItem”
    • ok 现在 this.onItemClickListener , onItemClickListener 无法解决!
    • OK 所以,从 ImageList 调用 setOnItemClickListener 。现在在你的 onBindViewHolder 中,将被点击的项目传递给 ImageList (因为 AppShowModule 将包含你想要的 AppShow 的 URL。现在从你的 ImageList 中抛出一个意图并将 URL 从 AppShowModule 传递给 AppShow 活动或片段,然后使用图像视图加载您使用 Picasso 的 url 内容
    • 感谢您的回答,但这是我的主要问题,我尝试了这个但它不起作用,请检查这个问题并尝试告诉我如何解决它,再次!谢谢link
    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 2016-11-09
    • 2016-10-29
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多