Xamarin在单击和长单击listview c#vs2017时获取错误项目
当筛选数据并单击LongItemClick时,我会得到错误的数据,当我单击ItemClick时,也会得到错误的数据 错误的数据。 我们能帮我吗Xamarin在单击和长单击listview c#vs2017时获取错误项目,c#,android,xamarin,visual-studio-2017,C#,Android,Xamarin,Visual Studio 2017,当筛选数据并单击LongItemClick时,我会得到错误的数据,当我单击ItemClick时,也会得到错误的数据 错误的数据。 我们能帮我吗 ContactsViewHolder holder = null; if (convertView == null) { convertView = mInflater.Inflate(Resource.Layout.list_row_contact_list, null);
ContactsViewHolder holder = null;
if (convertView == null)
{
convertView =
mInflater.Inflate(Resource.Layout.list_row_contact_list, null);
holder = new ContactsViewHolder();
// Show item in listView
holder.txtacSubject = convertView.FindViewById<TextView>
(Resource.Id.lr_fullName);
holder.txtacAddress = convertView.FindViewById<TextView>
(Resource.Id.lr_address);
holder.txtEmail = convertView.FindViewById<TextView>
(Resource.Id.lr_email);
holder.txtPib = convertView.FindViewById<TextView>
(Resource.Id.lr_pib);
convertView.Tag = holder;
}
else
{
holder = convertView.Tag as ContactsViewHolder;
}
holder.txtacSubject.Text =
contactListArrayList[position].acSubject.ToString();
holder.txtacAddress.Text = contactListArrayList[position].acAddress;
holder.txtEmail.Text = contactListArrayList[position].acPost;
holder.txtPib.Text = contactListArrayList[position].acCode;
if (position % 2 == 0)
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector);
}
else
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector_alternate);
}
return convertView;
}
public IList<the_SetSubjModel> GetAllData()
{
return contactListArrayList;
}
public class ContactsViewHolder : Java.Lang.Object
{
public TextView txtacSubject { get; set; }
public TextView txtacAddress { get; set; }
public TextView txtEmail { get; set; }
public TextView txtPib { get; set; }
public TextView txtacName2 { get; set; }
public TextView txtacPhone { get; set; }
public TextView txtacRegNo { get; set; }
public TextView txtanRebate { get; set; }
}
class ContactListBaseAdapterViewHolder : Java.Lang.Object
{
//Your adapter views to re-use
//public TextView Title { get; set; }
}
}
}
我需要改变什么才能正常工作
ContactsViewHolder holder = null;
if (convertView == null)
{
convertView =
mInflater.Inflate(Resource.Layout.list_row_contact_list, null);
holder = new ContactsViewHolder();
// Show item in listView
holder.txtacSubject = convertView.FindViewById<TextView>
(Resource.Id.lr_fullName);
holder.txtacAddress = convertView.FindViewById<TextView>
(Resource.Id.lr_address);
holder.txtEmail = convertView.FindViewById<TextView>
(Resource.Id.lr_email);
holder.txtPib = convertView.FindViewById<TextView>
(Resource.Id.lr_pib);
convertView.Tag = holder;
}
else
{
holder = convertView.Tag as ContactsViewHolder;
}
holder.txtacSubject.Text =
contactListArrayList[position].acSubject.ToString();
holder.txtacAddress.Text = contactListArrayList[position].acAddress;
holder.txtEmail.Text = contactListArrayList[position].acPost;
holder.txtPib.Text = contactListArrayList[position].acCode;
if (position % 2 == 0)
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector);
}
else
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector_alternate);
}
return convertView;
}
public IList<the_SetSubjModel> GetAllData()
{
return contactListArrayList;
}
public class ContactsViewHolder : Java.Lang.Object
{
public TextView txtacSubject { get; set; }
public TextView txtacAddress { get; set; }
public TextView txtEmail { get; set; }
public TextView txtPib { get; set; }
public TextView txtacName2 { get; set; }
public TextView txtacPhone { get; set; }
public TextView txtacRegNo { get; set; }
public TextView txtanRebate { get; set; }
}
class ContactListBaseAdapterViewHolder : Java.Lang.Object
{
//Your adapter views to re-use
//public TextView Title { get; set; }
}
}
}
我发送模型、活动和适配器
ContactsViewHolder holder = null;
if (convertView == null)
{
convertView =
mInflater.Inflate(Resource.Layout.list_row_contact_list, null);
holder = new ContactsViewHolder();
// Show item in listView
holder.txtacSubject = convertView.FindViewById<TextView>
(Resource.Id.lr_fullName);
holder.txtacAddress = convertView.FindViewById<TextView>
(Resource.Id.lr_address);
holder.txtEmail = convertView.FindViewById<TextView>
(Resource.Id.lr_email);
holder.txtPib = convertView.FindViewById<TextView>
(Resource.Id.lr_pib);
convertView.Tag = holder;
}
else
{
holder = convertView.Tag as ContactsViewHolder;
}
holder.txtacSubject.Text =
contactListArrayList[position].acSubject.ToString();
holder.txtacAddress.Text = contactListArrayList[position].acAddress;
holder.txtEmail.Text = contactListArrayList[position].acPost;
holder.txtPib.Text = contactListArrayList[position].acCode;
if (position % 2 == 0)
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector);
}
else
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector_alternate);
}
return convertView;
}
public IList<the_SetSubjModel> GetAllData()
{
return contactListArrayList;
}
public class ContactsViewHolder : Java.Lang.Object
{
public TextView txtacSubject { get; set; }
public TextView txtacAddress { get; set; }
public TextView txtEmail { get; set; }
public TextView txtPib { get; set; }
public TextView txtacName2 { get; set; }
public TextView txtacPhone { get; set; }
public TextView txtacRegNo { get; set; }
public TextView txtanRebate { get; set; }
}
class ContactListBaseAdapterViewHolder : Java.Lang.Object
{
//Your adapter views to re-use
//public TextView Title { get; set; }
}
}
}
这是我的模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace NovaAndroid.Model
{
public class the_SetSubjModel
{
public string acSubject { get; set; }
public string acAddress { get; set; }
public string acName2 { get; set; }
public string acPost { get; set; }
public string acCountry { get; set; }
public string acCode { get; set; }
public string acPhone { get; set; }
public string acRegNo { get; set; }
public decimal anRebate { get; set; }
public string acBuyer { get; set; }
public static explicit operator the_SetSubjModel(Java.Lang.Object v)
{
throw new NotImplementedException();
}
}
}
ContactsViewHolder holder = null;
if (convertView == null)
{
convertView =
mInflater.Inflate(Resource.Layout.list_row_contact_list, null);
holder = new ContactsViewHolder();
// Show item in listView
holder.txtacSubject = convertView.FindViewById<TextView>
(Resource.Id.lr_fullName);
holder.txtacAddress = convertView.FindViewById<TextView>
(Resource.Id.lr_address);
holder.txtEmail = convertView.FindViewById<TextView>
(Resource.Id.lr_email);
holder.txtPib = convertView.FindViewById<TextView>
(Resource.Id.lr_pib);
convertView.Tag = holder;
}
else
{
holder = convertView.Tag as ContactsViewHolder;
}
holder.txtacSubject.Text =
contactListArrayList[position].acSubject.ToString();
holder.txtacAddress.Text = contactListArrayList[position].acAddress;
holder.txtEmail.Text = contactListArrayList[position].acPost;
holder.txtPib.Text = contactListArrayList[position].acCode;
if (position % 2 == 0)
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector);
}
else
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector_alternate);
}
return convertView;
}
public IList<the_SetSubjModel> GetAllData()
{
return contactListArrayList;
}
public class ContactsViewHolder : Java.Lang.Object
{
public TextView txtacSubject { get; set; }
public TextView txtacAddress { get; set; }
public TextView txtEmail { get; set; }
public TextView txtPib { get; set; }
public TextView txtacName2 { get; set; }
public TextView txtacPhone { get; set; }
public TextView txtacRegNo { get; set; }
public TextView txtanRebate { get; set; }
}
class ContactListBaseAdapterViewHolder : Java.Lang.Object
{
//Your adapter views to re-use
//public TextView Title { get; set; }
}
}
}
这是我的适配器:
using System;
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.Views;
using Android.Widget;
using NovaAndroid.Model;
namespace NovaAndroid.Adapters
{
[Activity(Label = "ContactListBaseAdapter")]
public partial class ContactListBaseAdapter : BaseAdapter<the_SetSubjModel>
{
IList<the_SetSubjModel> contactListArrayList;
private LayoutInflater mInflater;
private Context activity;
public ContactListBaseAdapter(Context context, IList<the_SetSubjModel>
results)
{
this.activity = context;
contactListArrayList = results;
mInflater =
(LayoutInflater)activity.GetSystemService(Context.LayoutInflaterService);
}
public override int Count
{
get { return contactListArrayList.Count; }
}
public override long GetItemId(int position)
{
return position;
}
public override the_SetSubjModel this[int position]
{
get { return contactListArrayList[position]; }
}
public override Java.Lang.Object GetItem(int position)
{
return position;
}
ContactsViewHolder holder = null;
if (convertView == null)
{
convertView =
mInflater.Inflate(Resource.Layout.list_row_contact_list, null);
holder = new ContactsViewHolder();
// Show item in listView
holder.txtacSubject = convertView.FindViewById<TextView>
(Resource.Id.lr_fullName);
holder.txtacAddress = convertView.FindViewById<TextView>
(Resource.Id.lr_address);
holder.txtEmail = convertView.FindViewById<TextView>
(Resource.Id.lr_email);
holder.txtPib = convertView.FindViewById<TextView>
(Resource.Id.lr_pib);
convertView.Tag = holder;
}
else
{
holder = convertView.Tag as ContactsViewHolder;
}
holder.txtacSubject.Text =
contactListArrayList[position].acSubject.ToString();
holder.txtacAddress.Text = contactListArrayList[position].acAddress;
holder.txtEmail.Text = contactListArrayList[position].acPost;
holder.txtPib.Text = contactListArrayList[position].acCode;
if (position % 2 == 0)
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector);
}
else
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector_alternate);
}
return convertView;
}
public IList<the_SetSubjModel> GetAllData()
{
return contactListArrayList;
}
public class ContactsViewHolder : Java.Lang.Object
{
public TextView txtacSubject { get; set; }
public TextView txtacAddress { get; set; }
public TextView txtEmail { get; set; }
public TextView txtPib { get; set; }
public TextView txtacName2 { get; set; }
public TextView txtacPhone { get; set; }
public TextView txtacRegNo { get; set; }
public TextView txtanRebate { get; set; }
}
class ContactListBaseAdapterViewHolder : Java.Lang.Object
{
//Your adapter views to re-use
//public TextView Title { get; set; }
}
}
}
使用系统;
使用System.Collections.Generic;
使用Android.App;
使用Android.Content;
使用Android.Views;
使用Android.Widget;
使用NovaAndroid.Model;
namespace.android.Adapters
{
[活动(Label=“ContactListBaseAdapter”)]
公共部分类ContactListBaseAdapter:BaseAdapter
{
IList contactListArrayList;
私人停车场;
私人语境活动;
公共ContactListBaseAdapter(上下文,IList
结果)
{
这个活动=上下文;
contactListArrayList=结果;
mInflater=
(LayoutInflater)activity.GetSystemService(Context.LayoutInflaterService);
}
公共覆盖整数计数
{
获取{return contactListArrayList.Count;}
}
公共覆盖长GetItemId(int位置)
{
返回位置;
}
public覆盖_SetSubjModel this[int position]
{
获取{返回contactListArrayList[position];}
}
public override Java.Lang.Object GetItem(int位置)
{
返回位置;
}
我认为GetView方法有问题吗?
公共覆盖视图GetView(int位置、视图转换视图、视图组
(家长)
{
ContactsViewHolder holder = null;
if (convertView == null)
{
convertView =
mInflater.Inflate(Resource.Layout.list_row_contact_list, null);
holder = new ContactsViewHolder();
// Show item in listView
holder.txtacSubject = convertView.FindViewById<TextView>
(Resource.Id.lr_fullName);
holder.txtacAddress = convertView.FindViewById<TextView>
(Resource.Id.lr_address);
holder.txtEmail = convertView.FindViewById<TextView>
(Resource.Id.lr_email);
holder.txtPib = convertView.FindViewById<TextView>
(Resource.Id.lr_pib);
convertView.Tag = holder;
}
else
{
holder = convertView.Tag as ContactsViewHolder;
}
holder.txtacSubject.Text =
contactListArrayList[position].acSubject.ToString();
holder.txtacAddress.Text = contactListArrayList[position].acAddress;
holder.txtEmail.Text = contactListArrayList[position].acPost;
holder.txtPib.Text = contactListArrayList[position].acCode;
if (position % 2 == 0)
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector);
}
else
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector_alternate);
}
return convertView;
}
public IList<the_SetSubjModel> GetAllData()
{
return contactListArrayList;
}
public class ContactsViewHolder : Java.Lang.Object
{
public TextView txtacSubject { get; set; }
public TextView txtacAddress { get; set; }
public TextView txtEmail { get; set; }
public TextView txtPib { get; set; }
public TextView txtacName2 { get; set; }
public TextView txtacPhone { get; set; }
public TextView txtacRegNo { get; set; }
public TextView txtanRebate { get; set; }
}
class ContactListBaseAdapterViewHolder : Java.Lang.Object
{
//Your adapter views to re-use
//public TextView Title { get; set; }
}
}
}
ContactsViewHolder holder=null;
if(convertView==null)
{
convertView=
mInflater.flate(Resource.Layout.list\u row\u contact\u list,空);
holder=新触点viewholder();
//在listView中显示项目
holder.txtacSubject=convertView.FindViewById
(Resource.Id.lr_全名);
holder.txtacadress=convertView.FindViewById
(资源Id.lr_地址);
holder.txtEmail=convertView.FindViewById
(Resource.Id.lr_电子邮件);
holder.txtPib=convertView.FindViewById
(资源Id.lr_pib);
convertView.Tag=holder;
}
其他的
{
holder=convertView.Tag为CONTACTS VIEWHOLDER;
}
holder.txtaccubject.Text=
contactListArrayList[position].acSubject.ToString();
holder.txtacAddress.Text=contactListArrayList[position].acAddress;
holder.txtEmail.Text=contactListArrayList[position].acPost;
holder.txtPib.Text=contactListArrayList[位置]。acCode;
如果(位置%2==0)
{
convertView.SetBackgroundResource(Resource.Drawable.list_选择器);
}
其他的
{
convertView.SetBackgroundResource(Resource.Drawable.list\u selector\u alternate);
}
返回视图;
}
公共IList GetAllData()
{
返回contactListArrayList;
}
公共类contactsviewolder:Java.Lang.Object
{
公共文本视图txtaccsubject{get;set;}
公共文本视图txtacAddress{get;set;}
公共文本视图txtEmail{get;set;}
公共文本视图txtPib{get;set;}
公共文本视图txtacName2{get;set;}
公共文本视图txtacPhone{get;set;}
公共文本视图txtacRegNo{get;set;}
公共文本视图txtanretriep{get;set;}
}
类ContactListBaseAdapterWilder:Java.Lang.Object
{
//要重复使用的适配器视图
//公共文本视图标题{get;set;}
}
}
}
这是我的活动:
ContactsViewHolder holder = null;
if (convertView == null)
{
convertView =
mInflater.Inflate(Resource.Layout.list_row_contact_list, null);
holder = new ContactsViewHolder();
// Show item in listView
holder.txtacSubject = convertView.FindViewById<TextView>
(Resource.Id.lr_fullName);
holder.txtacAddress = convertView.FindViewById<TextView>
(Resource.Id.lr_address);
holder.txtEmail = convertView.FindViewById<TextView>
(Resource.Id.lr_email);
holder.txtPib = convertView.FindViewById<TextView>
(Resource.Id.lr_pib);
convertView.Tag = holder;
}
else
{
holder = convertView.Tag as ContactsViewHolder;
}
holder.txtacSubject.Text =
contactListArrayList[position].acSubject.ToString();
holder.txtacAddress.Text = contactListArrayList[position].acAddress;
holder.txtEmail.Text = contactListArrayList[position].acPost;
holder.txtPib.Text = contactListArrayList[position].acCode;
if (position % 2 == 0)
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector);
}
else
{
convertView.SetBackgroundResource(Resource.Drawable.list_selector_alternate);
}
return convertView;
}
public IList<the_SetSubjModel> GetAllData()
{
return contactListArrayList;
}
public class ContactsViewHolder : Java.Lang.Object
{
public TextView txtacSubject { get; set; }
public TextView txtacAddress { get; set; }
public TextView txtEmail { get; set; }
public TextView txtPib { get; set; }
public TextView txtacName2 { get; set; }
public TextView txtacPhone { get; set; }
public TextView txtacRegNo { get; set; }
public TextView txtanRebate { get; set; }
}
class ContactListBaseAdapterViewHolder : Java.Lang.Object
{
//Your adapter views to re-use
//public TextView Title { get; set; }
}
}
}
using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using NovaAndroid.Model;
using NovaAndroid.Adapters;
using Android.Views;
namespace NovaAndroid
{
[Activity(Label = "Svi kupci", MainLauncher = false)]
public class ToDoItemActivity : Activity
{
//Button btnAdd;
private SearchView sv;
private ListView lista;
private ArrayAdapter adapter;
IList<the_SetSubjModel> listaToDo = null;
List<the_SetSubjModel> readed = new List<the_SetSubjModel>();
the_SetSubjModel model = new the_SetSubjModel();
EditText contactList_txtSearch;
Button btnHomeScreen;
private const string URL =
"http://192.168.147.10:8888/Service.svc/GetAllSubjectWithoutBuyer";
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ToDoItemView);
btnHomeScreen = FindViewById<Button>(Resource.Id.buttonHome);
btnHomeScreen.Click += BtnHomeScreen_Click;
GetAllSubjectWithoutBuyer();
var str = readed.Select(x => x.acSubject).ToList();
var listView = FindViewById<ListView>(Resource.Id.listView);
contactList_txtSearch = FindViewById<EditText>
(Resource.Id.contactList_txtSearch);
lista = (ListView)FindViewById(Resource.Id.listView);
lista.Adapter = new ArrayAdapter<String>(this,
Android.Resource.Layout.SimpleListItem1, str);
lista = FindViewById<ListView>(Resource.Id.listView);
sv = FindViewById<SearchView>(Resource.Id.searchView);
adapter = new ArrayAdapter(this,
Android.Resource.Layout.SimpleListItem1, str);
lista.Adapter = adapter;
listaToDo = readed;
contactList_txtSearch.TextChanged +=
ContactList_txtSearch_TextChanged;
lista.ItemClick += Lista_ItemClick;
lista.ItemLongClick += Lista_ItemLongClick;
//
lista.Adapter = new ContactListBaseAdapter(this, listaToDo);
}
private void BtnHomeScreen_Click(object sender, EventArgs e)
{
var activityHome = new Intent(this, typeof(MainActivity));
StartActivity(activityHome);
}
private void GetAllSubjectWithoutBuyer()
{
WebRequest request = WebRequest.Create(URL);
request.Method = "GET";
request.ContentType = "application/json";
//request.ContentLength = DATA.Length;
try
{
using (var webClient = new System.Net.WebClient())
{
var json =
webClient.DownloadString("http://192.168.147.10:8888/
Service.svc/GetAllSubjectWithoutBuyer");
SResult web = JsonConvert.DeserializeObject<SResult>(json);
readed = web.GetAllSubjectWithoutBuyerResult;
}
}
catch (Exception ex)
{
}
}
private void ContactList_txtSearch_TextChanged(object sender,
Android.Text.TextChangedEventArgs e)
{
var searchText = contactList_txtSearch.Text;
//Compare the entered text with List
List<the_SetSubjModel> list = (from items in readed
where
items.acCode.Contains(contactList_txtSearch.Text)
select items).ToList<the_SetSubjModel>();
lista.Adapter = new ContactListBaseAdapter(this,list);
this.lista.DeferNotifyDataSetChanged();
}
private void Lista_ItemLongClick(object sender,
AdapterView.ItemLongClickEventArgs e)
{
the_SetSubjModel o = readed[e.Position];
var activityAddEdit = new Intent(this, typeof(AddEditActivity));
activityAddEdit.PutExtra("acSubject", o.acSubject.ToString());
activityAddEdit.PutExtra("acAddress", o.acAddress.ToString());
activityAddEdit.PutExtra("acPost", o.acPost.ToString());
activityAddEdit.PutExtra("acCode", o.acCode.ToString());
activityAddEdit.PutExtra("acCountry", o.acCountry.ToString());
activityAddEdit.PutExtra("acName2", o.acName2.ToString());
activityAddEdit.PutExtra("acPhone", o.acPhone.ToString());
activityAddEdit.PutExtra("acRegNo", o.acRegNo.ToString());
activityAddEdit.PutExtra("anRebate", o.anRebate.ToString());
StartActivity(activityAddEdit);
}
private void Lista_ItemClick(object sender,
AdapterView.ItemClickEventArgs e)
{
Toast.MakeText(this, adapter.GetItem(e.Position).ToString(),
ToastLength.Short).Show();
}
}
使用Android.App;
使用Android.Content;
使用Android.OS;
使用Android.Widget;
使用Newtonsoft.Json;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
Net系统;
使用NovaAndroid.Model;
使用NovaAndroid.Adapters;
使用Android.Views;
名称空间NovaAndroid
{
[活动(Label=“Svi kupci”,MainLauncher=false)]
公共类ToDoItemActivity:活动
{
//按钮btnAdd;
私有搜索视图sv;
私有ListView lista;
专用阵列适配器;
IList listaToDo=null;
List readed=新列表();
_SetSubjModel model=新的_SetSubjModel();
编辑文本联系人列表\u txtSearch;
按钮BTN家庭屏幕;
私有常量字符串URL=
"http://192.168.147.10:8888/Service.svc/GetAllSubjectWithoutBuyer";
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ToDoItemView);
btnHomeScreen=findviewbyd(Resource.Id.buttonHome);
btnHomeScreen.单击+=btnHomeScreen\u单击;
GetAllSubjectWithOutpuyer();
var str=readed.Select(x=>x.acSubject.ToList();
var listView=findviewbyd(Resource.Id.listView);
contactList_txtSearch=findviewbyd
(Resource.Id.contactList\u txtSearch);
lista=(ListView)FindViewById(Resource.Id.ListView);
lista.Adapter=新阵列适配器(此,
Android.Resource.Layout.SimpleListItem1,str);
lista=findviewbyd(Resource.Id.listView);
sv=findviewbyd(Resource.Id.searchView);
适配器=新阵列适配器(此,
Android.Resource.Layout.SimpleListItem1,str);
lista.Adapter=适配器;
listaToDo=已读取;
contactList_txtSearch.TextChanged+=
联系人列表\u txtSearch\u text已更改;
lista.ItemClick+=lista\u ItemClick;
lista.ItemLongClick+=lista_ItemLongClick;
//
Adapter=新的ContactListBaseAdapter(这个,listaToDo);
}
私有无效BTN HomeScreen_单击(对象发送者,事件参数e)
{
var activityHome=新意图(此,类型为(MainActivity));
StartActivity(活动之家);
}
private void GetAllSubjectWithOutpuyer()
{
WebRequest=WebRequest.Create(URL);
R