RecyclerView如何在向下滚动后拾取孩子的位置?

时间:2017-10-28 20:26:44

标签: c# android xamarin xamarin.android

我有一个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);                
        }          
    }

2 个答案:

答案 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);        
    }