【问题标题】:Realm Updating Seekbar领域更新搜索栏
【发布时间】:2017-03-03 22:58:29
【问题描述】:

我正在使用 Realm 来保存我的搜索栏更新。

我有一个 RecyclerView,将 X Items 手册添加到 RecyclerView, 在项目内部有用户的设置,我希望每个项目的设置分开。

    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();
    }

在 Fragment 被销毁后,我如何更新/保存进度 以及如何达到更新的进度

//编辑

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;
        }
    }

//领域对象

    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; }
    }

【问题讨论】:

  • 是的,每个项目都应该有自己的两个搜索栏
  • 我添加了一个与您的 recyclerview 适配器数据匹配的答案
  • 我觉得你理解错了。我的意思是我有一个包含多个项目的 RecyclerView,并且在每个项目中我都有一个对话框,您可以在其中更改搜索栏。所以 Seekbars 不在 Recycler 本身中,但我希望 seekbars 连接到 RecyclerView 中的特定项目。这就是为什么我在这里得到项目string name = name = Arguments.GetString("Name"); Ad = realm.All&lt;SAd&gt;().Where(m =&gt; m.mName == name).First();
  • 相同的过程,每个 SeekBar 的 Progess 必须在 RecyclerView.ViewHolder 被回收之前保存,或者在您的情况下,在 Fragment 被销毁之前,除非您将该信息保存在其他地方第一的。发布您的 RealmObject 模型和适配器数据样本。
  • 好的,我为 RecyclerView 和 RealmObject 添加了适配器

标签: c# android xamarin xamarin.android realm


【解决方案1】:

所以假设你有一个看起来像这样的RecyclerView

我们可以创建一个匹配的RealmObject 来保存您的数据。

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; }
}

我们可以创建一个RecyclerView.Adapter,它从您的Realm 实例中提取数据并将用户更改持久化到每个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;
    }
}

使用 10,000 个测试项目的示例用法:

[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);
    }
}

更改任何个人SeekBars 的值退出并重新启动应用程序,您的更改将被重新加载:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多