Java 如何一对一地匹配元素?
我有一个Recyclerview,里面有图像视图。当我点击任何一个图像时,我想在图像上显示一些关于图像的信息 好吧,我做了,但似乎一切都是随机发生的。。。当我点击第一张图片时,信息会出现在第二张图片上;当我点击第二张图片时,信息会正常工作;当我点击第三张图片时,信息不会出现,等等 这是我的一些代码Java 如何一对一地匹配元素?,java,android,Java,Android,我有一个Recyclerview,里面有图像视图。当我点击任何一个图像时,我想在图像上显示一些关于图像的信息 好吧,我做了,但似乎一切都是随机发生的。。。当我点击第一张图片时,信息会出现在第二张图片上;当我点击第二张图片时,信息会正常工作;当我点击第三张图片时,信息不会出现,等等 这是我的一些代码 @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View
@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方法。你也可以发布这个方法吗?它只是在运行动画和更改可见性,请检查编辑。还应该在哪里定义这些方法呢?:)嗨,我更新了答案。请检查并让我知道,我正在等待您的答复