Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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
Listview recyclerview中的评级栏显示xamarin评级变化的奇怪结果_Listview_Xamarin_Xamarin.android_Android Recyclerview_Ratingbar - Fatal编程技术网

Listview recyclerview中的评级栏显示xamarin评级变化的奇怪结果

Listview recyclerview中的评级栏显示xamarin评级变化的奇怪结果,listview,xamarin,xamarin.android,android-recyclerview,ratingbar,Listview,Xamarin,Xamarin.android,Android Recyclerview,Ratingbar,在一个recyclerview中使用9个以上的评级条时,它会显示奇怪的值。ie;当我对一个评级栏进行评级时,其他评级栏也会更改其值。 这是我的密码 public class SurveyAdapter : RecyclerView.Adapter { const String TAG = "QUICK_ADAPTER"; public override RecyclerView.ViewHolder OnCreateViewHolder (ViewGr

在一个recyclerview中使用9个以上的评级条时,它会显示奇怪的值。ie;当我对一个评级栏进行评级时,其他评级栏也会更改其值。 这是我的密码

 public class SurveyAdapter : RecyclerView.Adapter
    {
        const String TAG = "QUICK_ADAPTER";

        public override RecyclerView.ViewHolder OnCreateViewHolder (ViewGroup parent, int viewType)
        { 
            View v = LayoutInflater.From (parent.Context).Inflate (Resource.Layout.survey_items, parent, false); 
            return new ViewHolder (v);
        }

        public override void OnBindViewHolder (RecyclerView.ViewHolder holder, int position)
        {
            var vh = holder as ViewHolder;  

            vh.ratingBar.Rating = 0;
            vh.ratingBar.RatingBarChange += (o, e) => { 
                Log.Error (TAG, "Rating change pos:" + position + "  & value :" + (int)vh.ratingBar.Rating + "\n");
            }; 
        }

        public override int ItemCount {
            get { return 20; }
        }

        public class ViewHolder : RecyclerView.ViewHolder
        {
            public    RatingBar ratingBar{ get; private set; }

            public ViewHolder (View itemView) : base (itemView)
            {
                itemView.FindViewById<RatingBar> (Resource.Id.Rating);
            }
        }
    }
公共类调查适配器:RecyclerView.Adapter
{
const String TAG=“快速适配器”;
public override RecyclerView.ViewHolder OnCreateViewHolder(视图组父级,int-viewType)
{ 
视图v=LayoutFlater.From(parent.Context)。充气(Resource.Layout.survey_items,parent,false);
返回新的视图持有者(v);
}
公共覆盖无效OnBindViewHolder(RecyclerView.ViewHolder,int位置)
{
var vh=作为视图持有人的持有人;
vh.ratingBar.Rating=0;
vh.ratingBar.ratingBar变化+=(o,e)=>{
日志错误(标记“额定值更改位置:”+位置+”&值:“+(int)vh.ratingBar.Rating+”\n”);
}; 
}
公共覆盖int ItemCount{
获取{return 20;}
}
公共类ViewHolder:RecyclerView.ViewHolder
{
public RatingBar RatingBar{get;private set;}
公共视图持有者(视图项目视图):基础(项目视图)
{
itemView.findviewbyd(Resource.Id.Rating);
}
}
}
在评级栏中更改评级时,我会得到这样的结果。
假设我在位置1对比率杆进行评级

评级更改位置:1和值:4
评级更改位置:8和值:4
评级更改位置:12和值:4
评级更改位置:14和值:4

请尝试此操作

  • 如果使用的是
    ListView
    ,请覆盖以下方法

    @Override
    public int getViewTypeCount() {
        return getCount();
    }
    
    @Override
    public int getItemViewType(int position) {
        return position;
    }
    
  • 如果使用的是
    RecycyclerView
    -仅重写
    getItemViewType
    方法

    @Override
    public int getItemViewType(int position) {
        return position;
    }
    

  • 此解决方案适用于
    RecyclerView
    。为了详细说明此解决方案的工作原理,似乎
    RecyclerView
    使用
    position%itemViewCount
    逻辑来循环位置。在没有用于回收评级条的相关代码块的情况下,对于这种情况,有选择地关闭
    RecyclerView
    的“回收”功能是有意义的。重写
    getItemViewType
    就是这样做的,方法是返回
    位置,而不是
    位置%itemViewCount