这很奇怪,但是当我使用我的代码长时间点击一行时,该行上的星形变为金色(这就是我想要的),但每个星形相隔十行。 这是我的代码:
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView localeDisplay;
private static final int grey_blue = 0xff546E7A;
private static final int gold = 0xffffa000;
public MyViewHolder(final View view) {
super(view);
localeDisplay = (TextView) view.findViewById(R.id.languageText);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Languages currentLanguages = languagesList.get(getAdapterPosition());
Snackbar snackbar;
snackbar = Snackbar.make(view, currentLanguages.getLocaleDisplay() + " selected", Snackbar.LENGTH_INDEFINITE)
.setAction("Next", new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), MainActivity.class);
v.getContext().startActivity(intent);
}
});
View snackBarView = snackbar.getView();
snackBarView.setBackgroundColor(grey_blue);
snackbar.show();
}
}
);
view.setOnLongClickListener(new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v) {
Toast.makeText(v.getContext(), "Position is " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
ImageView star = (ImageView) view.findViewById(R.id.imageView);
if (star.getColorFilter() == null) {
star.setColorFilter(gold);
} else star.clearColorFilter();
return true;
}
}
);
}
我尝试过this tutorial,但会发生同样的行为。 我有什么想法可以纠正这个问题吗?
答案 0 :(得分:0)
这是因为您获得了R.id.imageView
个ID的所有项目。要做你想做的事,你需要抓住被点击的项目,只改变所选行的颜色;
答案 1 :(得分:0)
似乎您的视图正在被回收,这意味着您的侦听器引用被调用到所有回收的视图。
解决此问题的一种简单方法是在onBindViewHolder方法中为每个单独的视图设置新的引用。通常,Viewholder用于查找视图并保留回收视图的引用,在其中设置数据不是一个好主意。
您可以更改以下视图:
public ExampleViewHolder(View view) {
super(view);
myContainer = (LinearLayout) view.findViewById(R.id.myContainer);
localeDisplay = (TextView) view.findViewById(R.id.languageText);
star = (ImageView) view.findViewById(R.id.imageView);
}
并将侦听器设置为onBindViewHolder:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
ExampleHolder holder = (ExampleHolder) viewHolder;
//Insert the position reference
holder.myContainer.setTag(position);
// Setting listeners
holder.myContainer.setOnClickListener(this);
holder.myContainer.setOnLongClickListener(this);
}
然后在适配器上实现OnLongClickListener和OnClickListener。
@Override
public boolean onLongClick(View v) {
//Getting position
int position = (int)v.getTag();
//Insert your code
return false;
}
@Override
public void onClick(View v) {
//code here
}
如果有效,请给我留言。祝你好运。
答案 2 :(得分:0)
在您的适配器构造函数中,只需添加此部分:
setHasStableIds(true).
然后覆盖适配器类中的以下方法。
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}