StartActivityForResult inside adapter from button does not fire OnActivityResult - c#

I have try the following code to fire on activity result inside my atapter, when my button pressed without success. The activity TraEdit is starting correctly and updates my data. I can't refresh my list with NotifyDataSetChanged(), OnActivityResult never fires to control the result.
What i am doing wrong? Is there a way to NotifyDataSetChanged() inside my adapter or i have to try a different approach?
Any help appreciated.
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.Views;
using Android.Widget;
namespace Cashier
{
[Activity(Label = "TraBaseAdapter")]
public partial class TraBaseAdapter : BaseAdapter<TraTable>
{
List<TraTable> TraListArrayList;
private LayoutInflater mInflater;
private Context activity;
public TraBaseAdapter(Context context, List<TraTable> results)
{
activity = context;
TraListArrayList = results;
mInflater = (LayoutInflater)activity.GetSystemService(Context.LayoutInflaterService);
}
public override int Count { get { return TraListArrayList.Count; } }
public override long GetItemId(int position) { return position; }
public override TraTable this[int position] { get { return TraListArrayList[position]; } }
public override View GetView(int position, View convertView, ViewGroup parent)
{
TraViewHolder holder = null;
if (convertView == null)
{
convertView = mInflater.Inflate(Resource.Layout.TraRecord_view, null);
holder = new TraViewHolder
{
TxtBtnEdit = convertView.FindViewById<Button>(Resource.Id.TraEditButtonHolder),
TxtTraName = convertView.FindViewById<TextView>(Resource.Id.TraNameHolder),
TxtTraCode = convertView.FindViewById<TextView>(Resource.Id.TraCodeHolder)
};
if (!holder.TxtBtnEdit.HasOnClickListeners)
{
holder.TxtBtnEdit.Click += (sender, e) =>
{
TraEditClick(holder);
};
}
convertView.Tag = holder;
}
else { holder = convertView.Tag as TraViewHolder; }
holder.LineId = position;
holder.TraId = TraListArrayList[position].Cs_Traid;
holder.TxtBtnEdit.Tag = holder.LineId + 1;
holder.TxtTraName.Text = TraListArrayList[position].Cs_Name;
holder.TxtTraCode.Text = TraListArrayList[position].Cs_Code;
return convertView;
}
private void TraEditClick(TraViewHolder LineHolder)
{
Intent ActivityAddEditTra = new Intent(this.activity, typeof(TraEdit));
ActivityAddEditTra.PutExtra("TraIdSel", TraListArrayList[LineHolder.LineId].Cs_Traid);
ActivityAddEditTra.PutExtra("NameSel", TraListArrayList[LineHolder.LineId].Cs_Name);
ActivityAddEditTra.PutExtra("TraCodeSel", TraListArrayList[LineHolder.LineId].Cs_Code);
((Activity)activity).StartActivityForResult(ActivityAddEditTra, 99);
}
public void OnActivityResult(int RequestCode, Result ResultCode, Intent Data)
{
if (ResultCode == Result.Ok & RequestCode == 99)
{
int RowUpdate = Data.GetIntExtra("RowUpdate", 0);
NotifyDataSetChanged();
Toast.MakeText(activity, "Data changes :" + RowUpdate.ToString(), ToastLength.Short).Show();
}
}
public class TraViewHolder : Java.Lang.Object
{
public TextView TxtTraCode { get; set; }
public TextView TxtTraName { get; set; }
public Button TxtBtnEdit { get; set; }
public int LineId { get; set; }
public int TraId { get; set; }
}
}
}
In TraEdit:
......
Intent RetunData = new Intent();
SetResult(Result.Ok, RetunData);
RetunData.PutExtra("RowUpdate", RowsUpd);
......

Maybe
RetunData.PutExtra("RowUpdate", RowsUpd);
should come before
SetResult(Result.Ok, RetunData);
Im not good with VS but maybe the OnActivityResult method must be in the Activity not in the adapater

Related

Items not showing in recycler view Xamarin android

I am implementing recycler view in my Xamarin android application, But Items are not showing on debugging the application altough the InitData() Method is properly executed.
Here is the mainactivity.cs code in which recycler view is implemented:
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FinalProject_PU.Helper
{
class Data
{
public string IssueImage { get; set; }
public string UserImage { get; set; }
public string UserName { get; set; }
public DateTime IssueDate { get; set; }
public string IssueStatement { get; set; }
public int GetElevatedDates()
{
var ElevatedDays = (IssueDate.Date - DateTime.Now.Date).Days;
return ElevatedDays;
}
public string ElevatedDays
{
get { return ElevatedDays; }
set
{
if (GetElevatedDates() == 0)
{
ElevatedDays = "Today";
}
else
{
ElevatedDays = GetElevatedDates() + "Days";
}
}
}
}
}
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your application here
SetContentView(Resource.Layout.Home);
byte[] arr = Convert.FromBase64String(UserInfoHolder.Profile_pic);
imgwriteIssue = (ImageView)FindViewById(Resource.Id.imgwriteIssue);
imgwriteIssue.Click += delegate
{
var i = new Intent(this, typeof(CreateIssue));
this.StartActivity(i);
};
CircleImageView img = FindViewById<CircleImageView>(Resource.Id.circleImageView1);
Android.Graphics.Bitmap bitmap = BitmapFactory.DecodeByteArray(arr, 0, arr.Length);
img.SetImageBitmap(bitmap);
iconfunds = (ImageView)FindViewById(Resource.Id.iconFunds);
iconfunds.Click += Iconfunds_Click;
notifications = (ImageView)FindViewById(Resource.Id.iconNotifications);
notifications.Click += Notifications_Click;
map = (ImageView)FindViewById(Resource.Id.iconMap);
map.Click += Map_Click;
setting = (ImageView)FindViewById(Resource.Id.iconSettings);
setting.Click += Setting_Click;
recycler = FindViewById<RecyclerView>(Resource.Id.recyclerView1);
recycler.HasFixedSize = true;
// layoutManager = new LinearLayoutManager(this);
layoutManager = new GridLayoutManager(this, 1, GridLayoutManager.Horizontal, false);
recycler.SetLayoutManager(layoutManager);
InitData();
adapter = new RecyclerViewAdapter(lstData);
recycler.SetAdapter(adapter);
}
private async void InitData()
{
lstData = await IssueController.FetchPostList();
}
fetchallpost() method fetch all the issues from data and return a list of it.
but it is not showing in recycler view and application is halting in a few seconds after opening Homeactivity.cs
Here is the recycler view adapter class on which my programs breaks automatially
RecyclerViewAdapter.cs
using Android.Support.V7.Widget;
using Android.Views;
using Android.Widget;
using Refractored.Controls;
using System.Collections.Generic;
using System;
using Android.Content;
using AndroidX.Core.Graphics;
namespace FinalProject_PU.Helper
{
class RecyclerViewHolder : RecyclerView.ViewHolder
{
public ImageView imageview { get; set; }
public CircleImageView UserImage { get; set; }
public TextView UserName { get; set; }
public TextView IssueDate { get; set; }
public TextView IssueStatement { get; set; }
Android.Graphics.Typeface tf;
//
// public TextView Description { get; set; }
public RecyclerViewHolder(Android.Views.View itemView) : base(itemView)
{
imageview = itemView.FindViewById<ImageView>(Resource.Id.imageView1);
UserImage = itemView.FindViewById<CircleImageView>(Resource.Id.imgProfile);
UserName = itemView.FindViewById<TextView>(Resource.Id.tvname);
IssueDate = itemView.FindViewById<TextView>(Resource.Id.tvtime);
IssueStatement = itemView.FindViewById<TextView>(Resource.Id.tvinfo);
//beauttification
/*
tf = Typeface.CreateFromAsset(Assets, "Quicksand-Bold.otf");
IssueStatement.SetTypeface(tf, TypefaceStyle.Bold);
tf = Typeface.CreateFromAsset(Assets, "Quicksand-Bold.otf");
UserName.SetTypeface(tf, TypefaceStyle.Bold);
tf = Typeface.CreateFromAsset(Assets, "Quicksand-Bold.otf");
IssueDate.SetTypeface(tf, TypefaceStyle.Bold);
*/
}
}
class RecyclerViewAdapter : RecyclerView.Adapter
{
private List<Data> lstData = new List<Data>();
public RecyclerViewAdapter(List<Data> lstData)
{
this.lstData = lstData;
}
public override int ItemCount
{
get
{
return lstData.Count;
}
}
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
RecyclerViewHolder viewHolder = holder as RecyclerViewHolder;
byte[] arr0 = Convert.FromBase64String(lstData[position].IssueImage); //IssueImage
Bitmap b0 = BitmapFactory.DecodeByteArray(arr0, 0, arr0.Length);
viewHolder.imageview.SetImageBitmap(b0);
byte[] arr1 = Convert.FromBase64String(lstData[position].UserImage); //UserImage
Bitmap b1 = BitmapFactory.DecodeByteArray(arr1, 0, arr1.Length);
viewHolder.UserImage.SetImageBitmap(b1); //
viewHolder.UserName.Text = lstData[position].UserName;
viewHolder.IssueDate.Text = lstData[position].ElevatedDays;
viewHolder.IssueStatement.Text = lstData[position].IssueStatement;
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
LayoutInflater inflater = LayoutInflater.From(parent.Context);
Android.Views.View itemView = inflater.Inflate(Resource.Layout.items, parent, false);
return new RecyclerViewHolder(itemView);
}
}
}```
I have tried debugging the application to see what is causing the problem and it was found out that application is breaking when it reaches on this line in recycler view constructor.
I have made sure that the fetchallpost() method is actually returning list with data.
imageview = itemView.FindViewById<ImageView>(Resource.Id.imageView1);
please help me with this

Recycler view not working with database in Xamarin Android

I am implementing recyclerview in my xamarin android application and it is working in a very weird way
first when I hardcode item(data) in list my application halts and when I put data into list using database it doesn't stop working but doeesn't show any view.
Here is my HomeActivity.cs Code
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your application here
SetContentView(Resource.Layout.Home);
InitData();
recycler = FindViewById<RecyclerView>(Resource.Id.recyclerView1);
recycler.HasFixedSize = true;
// layoutManager = new LinearLayoutManager(this);
layoutManager = new GridLayoutManager(this, 1, GridLayoutManager.Horizontal, false);
recycler.SetLayoutManager(layoutManager);
adapter = new RecyclerViewAdapter(lstData);
recycler.SetAdapter(adapter);
}
private void InitData()
{
//foreach (var item in await IssueController.FetchPostList())
//{
// lstData.Add(item);
//}
lstData.Add(new Data()
{
IssueImage = "base64stringofimage",
UserImage = "base64stringofimage",
IssueDate = DateTime.Now,
UserName = "asadullah",
IssueStatement = "some issue statement"
});
}
I tried debugging to be more specific what is causing in to halt and I realized that it is halting at the end of OnBindViewHolder() method in recyclerviewadapter class.
This is the RecyclerViewAdapter Class:
RecyclerViewAdapter.cs
using Android.Graphics;
using Android.Support.V7.Widget;
using Android.Views;
using Android.Widget;
using Refractored.Controls;
using System.Collections.Generic;
using System;
using Android.Content;
using AndroidX.Core.Graphics;
namespace FinalProject_PU.Helper
{
class RecyclerViewHolder : RecyclerView.ViewHolder
{
public ImageView imageview { get; set; }
public CircleImageView UserImage { get; set; }
public TextView UserName { get; set; }
public TextView IssueDate { get; set; }
public TextView IssueStatement { get; set; }
Android.Graphics.Typeface tf;
//
// public TextView Description { get; set; }
public RecyclerViewHolder(Android.Views.View itemView) : base(itemView)
{
imageview = itemView.FindViewById<ImageView>(Resource.Id.imageView1);
UserImage = itemView.FindViewById<CircleImageView>(Resource.Id.imgProfile);
UserName = itemView.FindViewById<TextView>(Resource.Id.tvname);
IssueDate = itemView.FindViewById<TextView>(Resource.Id.tvtime);
IssueStatement = itemView.FindViewById<TextView>(Resource.Id.tvinfo);
//beauttification
/*
tf = Typeface.CreateFromAsset(Assets, "Quicksand-Bold.otf");
IssueStatement.SetTypeface(tf, TypefaceStyle.Bold);
tf = Typeface.CreateFromAsset(Assets, "Quicksand-Bold.otf");
UserName.SetTypeface(tf, TypefaceStyle.Bold);
tf = Typeface.CreateFromAsset(Assets, "Quicksand-Bold.otf");
IssueDate.SetTypeface(tf, TypefaceStyle.Bold);
*/
}
}
class RecyclerViewAdapter : RecyclerView.Adapter
{
private List<Data> lstData = new List<Data>();
public RecyclerViewAdapter(List<Data> lstData)
{
this.lstData = lstData;
}
public override int ItemCount
{
get
{
return lstData.Count;
}
}
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
RecyclerViewHolder viewHolder = holder as RecyclerViewHolder;
byte[] arr0 = Convert.FromBase64String(lstData[position].IssueImage); //IssueImage
Bitmap b0 = BitmapFactory.DecodeByteArray(arr0, 0, arr0.Length);
viewHolder.imageview.SetImageBitmap(b0);
byte[] arr1 = Convert.FromBase64String(lstData[position].UserImage); //UserImage
Bitmap b1 = BitmapFactory.DecodeByteArray(arr1, 0, arr1.Length);
viewHolder.UserImage.SetImageBitmap(b1); //
viewHolder.UserName.Text = lstData[position].UserName;
viewHolder.IssueDate.Text = lstData[position].ElevatedDays;
viewHolder.IssueStatement.Text = lstData[position].IssueStatement;
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
LayoutInflater inflater = LayoutInflater.From(parent.Context);
Android.Views.View itemView = inflater.Inflate(Resource.Layout.items, parent, false);
return new RecyclerViewHolder(itemView);
}
}
}

Xamarin.android - get information from a ListView

i'm new on Xamarin, i created a view where i'm showing a list of items, i created activity, axml files and style. It work well.
Now i would like start a "intent" on item selected but i have problem to get position or title of item.
My "Console.WriteLine(selectedFromList)" show just 0 value, i would like get more information from my item selected, like the right position or title, so i can validate and "intent" my specific activities for each item selected.
namespace app_sofis.Droid
{
[Activity(Label = "ServiziActivity" , Theme = "#style/ThemeActionBar")]
public class ServiziActivity : Activity
{
public static int TYPE_ITEM = 0;
public static int TYPE_SEPORATOR = 1;
List<IMenuItemsType> item = new List<IMenuItemsType>();
private ListView lst;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Servizi);
// my items
item.Add(new MenuHeaderItem("Servizi per il paziente"));
item.Add(new MenuContentItem("COLLO", "Inforntuni, patologie, interventi e riabilitazione", Resource.Mipmap.ic_schiena));
item.Add(new MenuContentItem("SPALLA", "Inforntuni, patologie, interventi e riabilitazione", Resource.Mipmap.ic_schiena));
item.Add(new MenuContentItem("SCHIENA", "Inforntuni, patologie, interventi e riabilitazione", Resource.Mipmap.ic_schiena));
lst = FindViewById<ListView>(Resource.Id.lstview);
lst.Adapter = new ListViewAdapter(this, item);
lst.ItemClick += (object sender, Android.Widget.AdapterView.ItemClickEventArgs e) =>
{
// HERE I WOULD LIKE VALIDATE ITEM AND START "intent" with my specific activities :)
string selectedFromList = lst.GetItemAtPosition(e.Position).ToString();
// trying to show item position but it return always 0
Console.WriteLine(selectedFromList);
};
}
// code for my listview
public interface IMenuItemsType
{
int GetMenuItemsType();
}
public class MenuHeaderItem : IMenuItemsType
{
public string HeaderText { get; set; }
public int GetMenuItemsType()
{
return TYPE_ITEM;
}
public MenuHeaderItem(string _headerText)
{
HeaderText = _headerText;
}
}
public class MenuContentItem : IMenuItemsType
{
public string Title { get; set; }
public string SubTitle { get; set; }
public int IconImage { get; set; }
public int GetMenuItemsType()
{
return TYPE_SEPORATOR;
}
public MenuContentItem(string _title, string _subtitle, int _iconImage)
{
Title = _title;
SubTitle = _subtitle;
IconImage = _iconImage;
}
}
public class ListViewAdapter : ArrayAdapter<IMenuItemsType>
{
private Context context;
private List<IMenuItemsType> items;
private LayoutInflater inflater;
public ListViewAdapter(Context context, List<IMenuItemsType> items) : base(context, 0, items)
{
this.context = context;
this.items = items;
this.inflater = (LayoutInflater)this.context.GetSystemService(Context.LayoutInflaterService);
}
public override int Count
{
get
{
//throw new System.NotImplementedException();
return items.Count;
}
}
public override long GetItemId(int position)
{
//throw new System.NotImplementedException();
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
//throw new System.NotImplementedException();
View view = convertView;
try
{
IMenuItemsType item = items[position];
if (item.GetMenuItemsType() == TYPE_ITEM)
{
MenuHeaderItem _headerItem = (MenuHeaderItem)item;
view = inflater.Inflate(Resource.Layout.ListViewHeaderItem, null);
// user dont click header item
view.Clickable = false;
var headerName = view.FindViewById<TextView>(Resource.Id.txtHeader);
headerName.Text = _headerItem.HeaderText;
}
else if (item.GetMenuItemsType() == TYPE_SEPORATOR)
{
MenuContentItem _contentItem = (MenuContentItem)item;
view = inflater.Inflate(Resource.Layout.ListViewContentItem, null);
var _title = view.FindViewById<TextView>(Resource.Id.txtTitle);
var _imgIcon = view.FindViewById<ImageView>(Resource.Id.imgIcon);
var _subTitle = view.FindViewById<TextView>(Resource.Id.txtSubTitle);
_title.Text = _contentItem.Title;
_imgIcon.SetBackgroundResource(_contentItem.IconImage);
_subTitle.Text = _contentItem.SubTitle;
}
}
catch (Exception ex)
{
Toast.MakeText(context, ex.Message, ToastLength.Long);
}
return view;
}
}
}
}
MY CONSOLE RETURN
[ViewRootImpl#1fcd26a[ServiziActivity]] ViewPostImeInputStage processPointer 0
[ViewRootImpl#1fcd26a[ServiziActivity]] ViewPostImeInputStage processPointer 1
app_sofis.Droid.ServiziActivity+MenuContentItem
You can use position to get item from the list:
lst.ItemClick += (object sender, Android.Widget.AdapterView.ItemClickEventArgs e) =>
{
MenuItemsType selectedItem = (MenuItemsType)item[e.Position];
Console.WriteLine(selectedItem.Title);
Console.WriteLine(selectedItem.SubTitle);
};
Hope this helps
I would suggest the following addition to your adapter class:
public override IMenuItemsType this [int index]
{
get { return items[index]; }
}
That way it is easier to access an item at the given position.
lst.ItemClick += (object sender, Android.Widget.AdapterView.ItemClickEventArgs e) =>
{
var selectedFromList = (lst.Adapter as ListViewAdapter)[e.Position];
if(selectedFromList is MenuHeaderItem)
{
var intent = new Intent(this, typeof(YOUR_ACTIVITY1));
StartActivity(intent);
}
if(selectedFromList is MenuContentItem)
{
var intent = new Intent(this, typeof(YOUR_ACTIVITY2));
StartActivity(intent);
}
};

Realm Updating Seekbar

I'm using Realm to save my seekbar updates.
I have a RecyclerView, adding X Items manual to the RecyclerView,
Inside the Items there are settings for the User and i want the settings seperate for each Item.
public static BottomSheet_Faecher newInstance(String mString)
{
BottomSheet_Faecher f = new BottomSheet_Faecher();
Bundle args = new Bundle();
args.PutString("string", mString);
f.Arguments = args;
return f;
}
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
mString = Arguments.GetString("string");
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View v = inflater.Inflate(Resource.Layout.Settings_Faecher_Wertung, container, false);
Fach1 = v.FindViewById<SeekBar>(Resource.Id.seek1);
Fach2 = v.FindViewById<SeekBar>(Resource.Id.seek2);
var prefs = PreferenceManager.GetDefaultSharedPreferences(this.Activity);
bool previouslyStarted = prefs.GetBoolean("first", false);
string name = name = Arguments.GetString("Name");
Ad = realm.All<SAd>().Where(m => m.mName == name).First();
if (!previouslyStarted)
{
wertungen = new HNWertung { HWertung = Fach1.Progress, NhWertung = Fach2.Progress };
realm.Write(() =>
{
Ad.mWertunglist.Add(wertungen);
});
var edit = prefs.Edit();
edit.PutBoolean("first", true);
edit.Commit();
}
var test = realm.All<HNWertung>().First();
Fach1.Progress = test.HauptfachWertung;
Fach2.Progress = test.NebenfachWertung;
//Fach1.Progress = L;
//Fach2.Progress = ListWertung.NebenfachWertung;
Fach1.ProgressChanged += Fach1_ProgressChanged;
Fach2.ProgressChanged += Fach2_ProgressChanged;
return v;
}
private void Fach2_ProgressChanged(object sender, SeekBar.ProgressChangedEventArgs e)
{
Fach1.Progress = 100 - e.Progress;
}
private void Fach1_ProgressChanged(object sender, SeekBar.ProgressChangedEventArgs e)
{
Fach2.Progress = 100 - e.Progress;
}
public override void OnDestroy()
{
base.OnDestroy();
}
And how can i update/ save the Progress, after the Fragment is destroyed
and how can i reach the updated Progress
//Edit
public class StufeAdapter : RecyclerView.Adapter
{
public event EventHandler<int> ItemClick;
private RecyclerView mRecyclerView;
private List<StufeAd> mStufenListe;
Realm realm = Realm.GetInstance();
public StufeAdapter(List<StufeAd> stufenListe, RecyclerView recyclerView)
{
mStufenListe = stufenListe;
mRecyclerView = recyclerView;
}
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
var viewholder = holder as StufeViewHolder;
viewholder.StufenPhoto.SetImageResource(mStufenListe[position].mPhoto);
viewholder.Stufe.Text = mStufenListe[position].mName;
viewholder.Durchschnitt.Text = mStufenListe[position].mDurchschnitt.ToString();
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.CardView_Stufe_Row, parent, false);
StufeViewHolder vh = new StufeViewHolder(view, OnClick);
return vh;
}
public override int ItemCount
{
get
{
return mStufenListe.Count;
}
}
//Realm Object
public class StufeAd : RealmObject
{
[PrimaryKey]
public string mName { get; set; }
public int mPhoto { get; set; }
public int mDurchschnitt { get; set; }
public IList<HNWertung> mWertunglist { get; }
}
public class HNWertung : RealmObject
{
public int HauptfachWertung { get; set; }
public int NebenfachWertung { get; set; }
}
So assuming you have a RecyclerView that looks like:
We can create a matching RealmObject that persists your data.
RealmObject:
public class ARealmObject : RealmObject
{
[PrimaryKey] // Use Gap-less Primary keys for super fast RecyclerView, otherwise you have to create a "positional" RealmObject mapping
public int Key { get; set; } // zero-based for RecyclerView Adapter
public string Caption { get; set; }
public int SeekBar1 { get; set; }
public int SeekBar2 { get; set; }
}
We can create a RecyclerView.Adapter that pulls the data from your Realm instance and persists user changes changes to each SeekBar.
RecyclerView.Adapter:
public class RealmAdapter : RecyclerView.Adapter
{
Realm realm;
IQueryable<ARealmObject> realmobjects;
public RealmAdapter(RealmConfiguration config)
{
realm = Realm.GetInstance(config);
realmobjects = realm.All<ARealmObject>();
}
public class RealmObjectViewHolder : RecyclerView.ViewHolder
{
readonly Timer timer;
readonly Realm realm;
ARealmObject aRealmObject;
string lastCaption;
public RealmObjectViewHolder(View view, Realm realm) : base(view)
{
this.realm = realm;
Caption = view.FindViewById<TextView>(Resource.Id.realmTextView);
SeekBar1 = view.FindViewById<SeekBar>(Resource.Id.seekBar1);
SeekBar2 = view.FindViewById<SeekBar>(Resource.Id.seekBar2);
SeekBar1.StopTrackingTouch += SeekBar_HandleEventHandler;
SeekBar2.StopTrackingTouch += SeekBar_HandleEventHandler;
}
public TextView Caption { get; private set; }
public SeekBar SeekBar1 { get; private set; }
public SeekBar SeekBar2 { get; private set; }
public int Key
{
get { return aRealmObject.Key; }
set
{
aRealmObject = realm.Find<ARealmObject>(value);
aRealmObject = aRealmObject ?? new ARealmObject { Key = value, Caption = $"missing key : {value}", SeekBar1 = 50, SeekBar2 = 50 };
Caption.Text = aRealmObject.Caption;
lastCaption = Caption.Text;
SeekBar1.Progress = aRealmObject.SeekBar1;
SeekBar2.Progress = aRealmObject.SeekBar2;
}
}
void SeekBar_HandleEventHandler(object sender, SeekBar.StopTrackingTouchEventArgs e)
{
UpdateRealmObject();
}
void UpdateRealmObject()
{
if (aRealmObject.Caption != Caption.Text || aRealmObject.SeekBar1 != SeekBar1.Progress || aRealmObject.SeekBar2 != SeekBar2.Progress)
{
lastCaption = Caption.Text;
realm.Write(() =>
{
aRealmObject.SeekBar1 = SeekBar1.Progress;
aRealmObject.SeekBar2 = SeekBar2.Progress;
realm.Add(aRealmObject, true); // Using the optional update: parameter set to true
});
}
}
}
public override int ItemCount
{
get { return realmobjects.Count(); }
}
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
var vh = holder as RealmObjectViewHolder;
vh.Key = position;
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
var itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.ARealmObjectCardView, parent, false);
var vh = new RealmObjectViewHolder(itemView, realm);
return vh;
}
}
Example Usage w/ 10,000 test items:
[Activity(Label = "RecyclerViewWithRealm", MainLauncher = true, Icon = "#mipmap/icon")]
public class MainActivity : Activity
{
RecyclerView recyclerView;
RecyclerView.Adapter adapter;
RecyclerView.LayoutManager layoutManager;
Realm masterRealmInstance;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
masterRealmInstance = Realm.GetInstance("RecyclerViewExample.realm");
if (masterRealmInstance.All<ARealmObject>().Count() == 0)
{
masterRealmInstance.Write(() => // Create some test data
{
for (int i = 0; i < 10000; i++)
{
masterRealmInstance.Add(new ARealmObject { Key = i, Caption = $"StackOverFlow # + {i.ToString()}", SeekBar1 = 50, SeekBar2 = 50 });
}
});
}
SetContentView(Resource.Layout.ARecyclerLayOut);
recyclerView = (RecyclerView)FindViewById(Resource.Id.recyclerView);
recyclerView.HasFixedSize = true;
layoutManager = new LinearLayoutManager(this);
recyclerView.SetLayoutManager(layoutManager);
adapter = new RealmAdapter((RealmConfiguration)masterRealmInstance.Config);
recyclerView.SetAdapter(adapter);
}
}
Change the values of any of the individual SeekBars exit and restart the application and your changes will be reloaded:

Custom listview has false information Xamarin Android

I'm new coding Xamarin, so i made a custom adapter, my idea was to save everything, when the user closes the app. After some research I thought this code was gonna work:
List<GardenClass> MyList = new List<GardenClass> ();
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
listview.Adapter = new GardenAdapter(this, MyList);
}
protected override void OnPause()
{
base.OnPause();
write();
}
public void write()
{
string path = System.Environment.GetFolderPath(SpecialFolder.Personal);
string filename = Path.Combine(path, "Files.txt");
try
{
File.WriteAllText(filename,JsonConvert.SerializeObject(MyList));
}
catch (Exception e)
{
Console.WriteLine("Failed to serialize. Reason: " + e.Message);
throw;
}
}
public class GardenAdapter : BaseAdapter<GardenClass>
{
private Context MyCon;
List<GardenClass> items;
Activity context;
public GardenAdapter(Activity context, List<GardenClass> items)
: base()
{
MyCon = context;
this.context = context;
this.items = items;
}
public override long GetItemId(int position)
{
return position;
}
public override GardenClass this[int position]
{
get { return items[position]; }
}
public override int Count
{
get { return items.Count; }
}
public override Android.Views.View GetView(int position, Android.Views.View convertView, ViewGroup parent)
{
var item = items[position];
Android.Views.View view;
if (convertView == null) {
view = context.LayoutInflater.Inflate(Resource.Layout.ListItem, null);
} else { view = convertView; }
view.FindViewById<TextView>(Resource.Id.textView1).Text = item.ToDo;
view.FindViewById<TextView>(Resource.Id.textView2).Text = "Week " + item.Week.ToString();
view.FindViewById<CheckBox>(Resource.Id.checkBox1).Checked = item.Done;
CheckBox MyCheckBox;
checkding = view.FindViewById<CheckBox>(Resource.Id.checkBox1);
// The folowing code prevents the checkbox of stealing the focus, which make a singular listview item unclickable
MyCheckBox.Focusable = false;
MyCheckBox.FocusableInTouchMode = false;
MyCheckBox.Clickable = true;
return view;
}
}
[Serializable]
public class ZaaiSpul
{
public int Week { get; set; }
public string ToDo { get; set; }
public bool Done { get; set; }
}
But when the OnPause() function gets called, then MyList gives me incorrect information(saw it myself in the debugger).
I'm sorry if I did some wrong things, but I'm new to Xamarin.
I hope you can help me.
You're only reading the check box state, you're never saving it when it changes. Add this in your GetView:
MyCheckBox.CheckedChange += (sender, e) =>
{
items[position].Done = e.IsChecked;
};

Categories

Resources