我有一个RecyclerView,我想改变" Items"的背景。我点击了。 一切都适用于"项目"已经在视野中。但当我放下滚动条,然后点击"项目"它选择其他项目,我点击项目15,然后选择项目3,当我放下滚动时,视图中的元素处于重置位置。也就是说,如果没有我使用scrool,我会回到第15项,当我点击它时,它处于较小的位置。我怎么得到这个?
private void ListViewAdp_ItemClick(object sender, int e)
{
for (int i = 0; i < listView.ChildCount; i++)
{
if(e == i)
listView.GetChildAt(i).SetBackgroundResource(Resource.Color.alt_green);
else
listView.GetChildAt(i).SetBackgroundColor(Color.Transparent);
}
}
答案 0 :(得分:0)
您可以在RecyclerView上添加触控侦听器吗?这可以防止您不必担心项目位置,还可以免费提供方便的 onLongClick 事件来检测用户长时间按下项目的情况。您可以显示上下文菜单或执行其他上下文操作。
recyclerView.addOnItemTouchListener(new GalleryAdapter.RecyclerTouchListener(getApplicationContext(), recyclerView, new GalleryAdapter.ClickListener() {
@Override
public void onClick(View view, int position) {
}
@Override
public void onLongClick(View view, int position) {
}
}));
答案 1 :(得分:0)
问题是您正在更改视图的背景颜色,然后在向下滚动时用于显示另一个项目。它被称为RecyclerView是有原因的!正在修改您正在修改的视图以显示其他项目。
所以它需要看起来像这样......
private void ListViewAdp_ItemClick(object sender, int e)
{
SelectedPosition = e;
}
WHERE ...
public int SelectedPosition
{
get => _viewModel.CurrentRowIndex;
set
{
int lastPos = _viewModel.CurrentRowIndex;
_viewModel.CurrentRowIndex = value;
NotifyItemChanged(lastPos);
NotifyItemChanged(value);
}
}
项目更改通知会导致视图反弹。这是改变颜色的时候。
public override void
OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if(SelectedPosition == position)
holder.ItemView.SetBackgroundResource(Resource.Color.alt_green);
else
holder.ItemView.SetBackgroundColor(Color.Transparent);
}