Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何一对一地匹配元素?_Java_Android - Fatal编程技术网

Java 如何一对一地匹配元素?

Java 如何一对一地匹配元素?,java,android,Java,Android,我有一个Recyclerview,里面有图像视图。当我点击任何一个图像时,我想在图像上显示一些关于图像的信息 好吧,我做了,但似乎一切都是随机发生的。。。当我点击第一张图片时,信息会出现在第二张图片上;当我点击第二张图片时,信息会正常工作;当我点击第三张图片时,信息不会出现,等等 这是我的一些代码 @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View

我有一个Recyclerview,里面有图像视图。当我点击任何一个图像时,我想在图像上显示一些关于图像的信息

好吧,我做了,但似乎一切都是随机发生的。。。当我点击第一张图片时,信息会出现在第二张图片上;当我点击第二张图片时,信息会正常工作;当我点击第三张图片时,信息不会出现,等等

这是我的一些代码

@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);

    myViewHolder = new MyViewHolder(view);

    myViewHolder.imageView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
       if (isUp) {
           slideDown(myViewHolder.infoView);
       } else {
           slideUp(myViewHolder.infoView);
       }
           isUp = !isUp;
       }
    });

return myViewHolder;
}

class MyViewHolder extends RecyclerView.ViewHolder {

    ImageView imageView;

    public MyViewHolder(View itemView) {
       super(itemView);
       init();
    }

    void init() {
       imageView = itemView.findViewById(R.id.imageViewID);
       ...
    }
}
看来我应该把一些元素组合起来,或者有更好的方法吗

玻片法

// slide the view from below itself to the current position
public void slideUp(View view) {
    view.setVisibility(View.VISIBLE);
    infoView.animate().alpha(1.0f).setDuration(500);
    ScaleAnimation animate = new ScaleAnimation(
            1f, 1f, // Start and end values for the X axis scaling
            0f, 1f, // Start and end values for the Y axis scaling
            Animation.RELATIVE_TO_SELF, 0f, // Pivot point of X scaling
            Animation.RELATIVE_TO_SELF, 1f);                // toYDelta
    animate.setDuration(800);
    animate.setFillAfter(true);
    view.startAnimation(animate);
}
我将onClickListener方法移动到onBindViewHolder,这是有意义的,但结果并没有改变

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    holder.textView_name.setText(nameElement.get(position).text());
    Picasso.get().load(imageElement.get(position).absUrl("src")).fit().into(holder.imageView);

    holder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isUp) {
                myViewHolder.slideDown(myViewHolder.infoView);
            } else {
                myViewHolder.slideUp(myViewHolder.infoView);
            }
            isUp = !isUp;
        }
    });
}

您应该在
onBindViewHolder
中为ViewHolder添加侦听器,而不是
onCreateViewHolder
首先,最好在
onBindViewHolder
中定义
onClickListener
其次,将数据存储在POJO类上,并保存最后的状态, 因此,您可以保留项目的最后状态(isUP或!)

例如,您有以下模型:

class ImageModel {

  private String imageURI;
  private Boolean isUP ; 
  //getter setters
}
然后,如果将ImageModel列表传递到适配器中,则可以轻松更改
isUP

并在适配器上根据
isUP

   if (model.isUp) {
       slideDown(myViewHolder.infoView);
   } else {
       slideUp(myViewHolder.infoView);
   }

您需要在MyViewHolder类中添加slideUp slideDown方法

我认为无需在onBindViewHolder中实现click listener,只需将其放在init函数中即可

   void init() {                                                          
       imageView = itemView.findViewById(R.id.imageViewID);               
       imageView.setOnClickListener(new View.OnClickListener() {          
           @Override                                                      
           public void onClick(View v) {                                  
               if (isUp) {                                                
                   slideDown(v);                                          
               } else {                                                   
                   slideUp(v);                                            
               }                                                          
               isUp = !isUp;                                              
           }                                                              
       });                                                                
   }

希望它能工作

我确实试过了,但没有什么改变。我的回收器中已经有onBindViewHolder方法。但我对使用slideDown(myViewHolder.infoView)感到困惑;或向下滑动(holder.infoView);我应该在哪里定义我的infoView?在回收类还是持有者类?嗨,实际上我不知道你的slideDown,SlideUp方法。你也可以发布这个方法吗?它只是在运行动画和更改可见性,请检查编辑。还应该在哪里定义这些方法呢?:)嗨,我更新了答案。请检查并让我知道,我正在等待您的答复