C# ListView在更新其屏幕后不保存更改

C# ListView在更新其屏幕后不保存更改,c#,android,listview,xamarin,xamarin.android,C#,Android,Listview,Xamarin,Xamarin.android,每次我更新屏幕(更改旋转或离开屏幕,然后返回屏幕)时,它不会保存更新的列表,我会返回默认列表。提前感谢根据您的描述,当您更改某些listview项目时,listview不会更新 我做了一个示例,您可以看看,创建公共静态列表和ListAdapter public class MainActivity : AppCompatActivity { public static List<Earthquake> earthquakes; ListView lvw; pub

每次我更新屏幕(更改旋转或离开屏幕,然后返回屏幕)时,它不会保存更新的列表,我会返回默认列表。提前感谢根据您的描述,当您更改某些listview项目时,listview不会更新

我做了一个示例,您可以看看,创建公共静态列表和ListAdapter

 public class MainActivity : AppCompatActivity
{
   public static List<Earthquake> earthquakes;
    ListView lvw;
   public static EarthquakeListAdapter listadapter;
    Button btnadd;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);

         earthquakes = new List<Earthquake>
        {
            new Earthquake{Place="Nepal", DateOccured="May 12, 2015" },
            new Earthquake{Place="Solomon Sea", DateOccured="May 7, 2015" },
            new Earthquake{Place="Papua New Guinea", DateOccured="May 5, 2015" },
            new Earthquake{Place="Nepal", DateOccured="April 25, 2015" },
            new Earthquake{Place="Taiwan", DateOccured="April 20, 2015" },
            new Earthquake{Place="Papua New Guinea", DateOccured="March 29, 2015" },
            new Earthquake{Place="Flores Sea", DateOccured="Febdruary 27, 2015" },
            new Earthquake{Place="Mid-Atlantic range", DateOccured="Febdruary 13, 2015" }
        };
        lvw = FindViewById<ListView>(Resource.Id.lvwEarthquakes);
        btnadd = FindViewById<Button>(Resource.Id.button1);
        btnadd.Click += Btnadd_Click;
        listadapter= new EarthquakeListAdapter(this, earthquakes);
        lvw.Adapter = listadapter;
        lvw.ItemLongClick += Lvw_ItemLongClick; ;
        lvw.ItemClick += Lvw_ItemClick;
    }
    protected override void OnResume()
    {
        Log.Debug("OnResume", "OnResume called, app is ready to interact with the user");
        base.OnResume();
        listadapter = new EarthquakeListAdapter(this, earthquakes);
        lvw.Adapter = listadapter;
    }

    private void Lvw_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
    {
        var item = earthquakes[e.Position];
        MainActivity.earthquakes.Remove(item);
        List<Earthquake> items = MainActivity.earthquakes;
        listadapter = new EarthquakeListAdapter(this, earthquakes);
        lvw.Adapter = listadapter;

    }

    private void Lvw_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
    {
        Intent intent = new Intent(this, typeof(editActivity));
        //Earthquake temp = MainActivity.earthquakes[e.Position];
        string position = e.Position.ToString();
        intent.PutExtra("p", position);
        StartActivity(intent);
    }

  

 

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

public class Earthquake
{
    public string Place { get; set; }
    public string DateOccured { get; set; }
}

 public class EarthquakeListAdapter : BaseAdapter<Earthquake>
{

    List<Earthquake> earthquakes;
    Activity context;

    /// <summary>
    /// Constructor 
    /// </summary>
    /// <param name="context"></param>
    /// <param name="earthquakeList"></param>
    public EarthquakeListAdapter(Activity currentContext, List<Earthquake> earthquakeList) : base()
    {
        this.earthquakes = earthquakeList;
        this.context = currentContext;
    }

    public override Earthquake this[int position]
    {
        get { return earthquakes.ToArray()[position]; }
    }

    public override int Count
    {
        get { return earthquakes.Count; }
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView;
        if (view == null)
        {
            view = context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem2, null);
            view.FindViewById<TextView>(Android.Resource.Id.Text1).Text = earthquakes.ToArray()[position].Place;
            view.FindViewById<TextView>(Android.Resource.Id.Text2).Text = earthquakes.ToArray()[position].DateOccured;
        }
        return view;
    }

   
}

 public class editActivity : Activity
{
    EditText edittext1;
    EditText edittext2;
    int position;
    Button button;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.editlayout1);
        // Create your application here
        edittext1 = FindViewById<EditText>(Resource.Id.editText1);
        edittext2 = FindViewById<EditText>(Resource.Id.editText2);
        button = FindViewById<Button>(Resource.Id.button1);
        button.Click += Butto1_Click;

        string text = Intent.GetStringExtra("p");
       position = Convert.ToInt32(text);
        edittext1.Text = MainActivity.earthquakes[position].Place;
        edittext2.Text = MainActivity.earthquakes[position].DateOccured;
    }

    private void Butto1_Click(object sender, EventArgs e)
    {
        MainActivity.earthquakes[position] = new Earthquake() { Place = edittext1.Text, DateOccured = edittext2.Text };

        OnBackPressed();
       
    }
}
public类main活动:AppCompatActivity
{
公共静态列表;
列表视图lvw;
公共静态地震适配器列表适配器;
按钮btnadd;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(这个,savedInstanceState);
//从“主”布局资源设置视图
SetContentView(Resource.Layout.activity_main);
地震=新列表
{
新地震{Place=“Nepal”,DateOccursed=“2015年5月12日”},
新地震{Place=“Solomon Sea”,DateOccursed=“2015年5月7日”},
新地震{Place=“巴布亚新几内亚”,DateOccursed=“2015年5月5日”},
新地震{Place=“Nepal”,DateOccursed=“2015年4月25日”},
新地震{Place=“Taiwan”,DateOccursed=“2015年4月20日”},
新地震{Place=“巴布亚新几内亚”,DateOccursed=“2015年3月29日”},
新地震{Place=“Flores Sea”,DateOccursed=“2015年2月27日”},
新地震{Place=“大西洋中部山脉”,DateOccursed=“2015年2月13日”}
};
lvw=findviewbyd(Resource.Id.lvwEarthquakes);
btnadd=findviewbyd(Resource.Id.button1);
btnadd.Click+=btnadd\u Click;
listadapter=新的地震适应器(这是地震);
lvw.Adapter=listadapter;
lvw.ItemLongClick+=lvw_ItemLongClick;
lvw.ItemClick+=lvw\u ItemClick;
}
受保护的覆盖void OnResume()
{
调试(“OnResume”,“OnResume已调用,应用程序已准备好与用户交互”);
base.OnResume();
listadapter=新的地震适应器(这是地震);
lvw.Adapter=listadapter;
}
私有void Lvw_ItemLongClick(对象发送者,AdapterView.ItemLongClickEventArgs e)
{
var项目=地震[e.位置];
主活动。地震。移除(项目);
列表项=MainActivity.bestions;
listadapter=新的地震适应器(这是地震);
lvw.Adapter=listadapter;
}
私有void Lvw_ItemClick(对象发送者,AdapterView.ItemClickEventArgs e)
{
意向意向=新意向(此,类型为(编辑活动));
//地震温度=主要活动地震[东位置];
字符串位置=e.position.ToString();
意向。额外(“p”,位置);
星触觉(意向);
}
public override void OnRequestPermissionsResult(int-requestCode,string[]permissions,[GeneratedEnum]Android.Content.PM.Permission[]grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(请求代码、权限、GrantResult);
base.OnRequestPermissionsResult(请求代码、权限、GrantResult);
}
}
公共级地震
{
公共字符串Place{get;set;}
公共字符串DateOccursed{get;set;}
}
公共类EarthquakeListAdapter:BaseAdapter
{
列出地震;
活动语境;
/// 
///建造师
/// 
/// 
/// 
公共EarthquakeListAdapter(Activity currentContext,List earthquakeList):base()
{
地震=地震学家;
this.context=currentContext;
}
公共覆盖此[int位置]
{
获取{返回地震。ToArray()[position];}
}
公共覆盖整数计数
{
获取{返回地震。计数;}
}
公共覆盖长GetItemId(int位置)
{
返回位置;
}
公共覆盖视图GetView(int位置、视图转换视图、视图组父视图)
{
视图=转换视图;
如果(视图==null)
{
view=context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem2,null);
view.FindViewById(Android.Resource.Id.Text1).Text=sequences.ToArray()[position].Place;
view.FindViewById(Android.Resource.Id.Text2)。Text=sequences.ToArray()[position]。DateOccursed;
}
返回视图;
}
}
公共类编辑活动:活动
{
编辑文本编辑文本1;
编辑文本编辑文本2;
内部位置;
按钮;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.editlayout1);
//在此处创建应用程序
edittext1=FindViewById(Resource.Id.edittext1);
edittext2=FindViewById(Resource.Id.edittext2);
button=findviewbyd(Resource.Id.button1);
按钮。单击+=按钮1\u单击;
string text=Intent.GetStringExtra(“p”);
位置=转换.ToInt32(文本);
edittext1.Text=MainActivity.地震[position].Place;
edittext2.Text=MainActivity.Seventures[position]。DateOccursed;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
MainActivity.Seventures[position]=new Sevention(){Place=edittext1.Text,DateOccursed=edittext2.Text};
OnBackPressed();
}
}

即使我完全关闭应用程序,我也希望它像保存列表视图一样。@Jonathan不确定你的意思,即使我完全关闭应用程序,保存列表视图是什么意思,你想在应用程序再次打开时显示更新后的列表视图吗?是的,但我设法解决了问题,我只是添加了一个数据库来保存列表to@Jonathan对最好在更新数据时使用数据库,然后从数据库加载数据以在ListView中显示。
    EditText etTitle, etDirector, etAvg, etLength;

    Bitmap bitmap;
    int pos = -1;
    ImageView iv;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.edit_movie);
        iv = FindViewById<ImageView>(Resource.Id.ivMovie);
        btnSave = FindViewById<Button>(Resource.Id.btnSave);
        btnAddPic = FindViewById<Button>(Resource.Id.btnAddPic);
        etTitle = FindViewById<EditText>(Resource.Id.etTitle);
        etDirector = FindViewById<EditText>(Resource.Id.etDirector);
        etAvg = FindViewById<EditText>(Resource.Id.etAvg);
        etLength = FindViewById<EditText>(Resource.Id.etLength);
        pos = Intent.GetIntExtra("pos", -1);//-1 is default
        btnAddPic.SetOnClickListener(this);
        btnSave.SetOnClickListener(this);
        if (pos != -1)// update 
        {
            Movie temp = MovieActivity.movieList[pos];
            Toast.MakeText(this, "position is  " + pos, ToastLength.Long).Show();
            etTitle.Text = temp.getTitle();
            etDirector.Text = temp.getDirector();
            etAvg.Text = "" + temp.getAvg();
            etLength.Text = "" + temp.getLength();
            bitmap = temp.getBitmap();
            iv.SetImageBitmap(temp.getBitmap());
        }
        else // new movie
        {
            Toast.MakeText(this, "lets add new item ", ToastLength.Long).Show();
        }
    }
    public void OnClick(View v)
    {
        if (v == btnAddPic)
        {
            Intent intent = new Intent(Android.Provider.MediaStore.ActionImageCapture);
            StartActivityForResult(intent, 0);
        }
        else
            if (v == btnSave)
        {
            int length = int.Parse(etLength.Text);
            int avg = int.Parse(etAvg.Text);
            string title = etTitle.Text;
            string director = etDirector.Text;
            Movie m = null;
            if (pos != -1)//updates
            {
                m = new Movie(length, title, director, bitmap);
                MovieActivity.movieList[pos] = m;
                Finish();
            }
            else// adds new movie
            {
                m = new Movie(length, title, director, bitmap);
                MovieActivity.movieList.Add(m);
                Finish();
            }
        }
    }
    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        if (requestCode == 0)//coming from camera
        {
            if (resultCode == Result.Ok)
            {
                bitmap = (Android.Graphics.Bitmap)data.Extras.Get("data");
                iv.SetImageBitmap(bitmap);
            }
        }
    }
}`
 public class Movie
{
    private int length;
    private string title;
    private string director;
    private int avg;
    private Android.Graphics.Bitmap bitmap;
    public Movie(int length, string title, string director,Android.Graphics.Bitmap bitmap )
    {
        this.length = length;
        this.title = title;
        this.director = director;
        this.avg = 0;
        this.bitmap = bitmap;

    }
    public void setBitmap(Android.Graphics.Bitmap bitmap)
    {
        this.bitmap = bitmap;
    }
    public Android.Graphics.Bitmap getBitmap()
    {
        return bitmap;
    }
    public void setAvg(int avg)
    {
        this.avg = avg;
    }
    public int getAvg()
    {
        return avg;
    }
    public void setDirector(string director)
    {
        this.director = director;
    }
    public string getDirector()
    {
        return director;
    }
    public void setTitle(string title)
    {
        this.title = title;
    }
    public string getTitle()
    {
        return title;
    }
    public void setLength(int length)
    {
        this.length = length;
    }
    public int getLength()
    {
        return length;
    }

}
class MovieAdapter:BaseAdapter<Movie>
{
    Android.Content.Context context;
    List<Movie> objects;
    
    public MovieAdapter(Android.Content.Context context, System.Collections.Generic.List<Movie> objects)
    {
        this.context = context;
        this.objects = objects;
    }

    public List<Movie> GetList()
    {
        return this.objects;
    }

    public override long GetItemId(int position)
    {
        return position;
    }
    public override int Count
    {
        get { return this.objects.Count; }
    }

    public override Movie this[int position]
    {
        get { return this.objects[position]; }
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        Android.Views.LayoutInflater layoutInflater = ((MovieActivity)context).LayoutInflater;
        Android.Views.View view = layoutInflater.Inflate(Resource.Layout.movie_layoutxml, parent, false);
        TextView tvTitle = view.FindViewById<TextView>(Resource.Id.tvTitle);
        TextView tvDirector = view.FindViewById<TextView>(Resource.Id.tvDirector);
        TextView tvLength = view.FindViewById<TextView>(Resource.Id.tvlength);
        TextView tvAvg = view.FindViewById<TextView>(Resource.Id.tvAvg);
        ImageView ivCover = view.FindViewById<ImageView>(Resource.Id.ivCover);
        Movie temp = objects[position];
        if(temp != null)
        {
            ivCover.SetImageBitmap(temp.getBitmap());
            tvAvg.Text = "" + temp.getAvg();
            tvTitle.Text = temp.getTitle();
            tvLength.Text ="" + temp.getLength();
            tvDirector.Text = temp.getDirector();
        }
        return view;
    }
}
 public class MainActivity : AppCompatActivity
{
   public static List<Earthquake> earthquakes;
    ListView lvw;
   public static EarthquakeListAdapter listadapter;
    Button btnadd;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);

         earthquakes = new List<Earthquake>
        {
            new Earthquake{Place="Nepal", DateOccured="May 12, 2015" },
            new Earthquake{Place="Solomon Sea", DateOccured="May 7, 2015" },
            new Earthquake{Place="Papua New Guinea", DateOccured="May 5, 2015" },
            new Earthquake{Place="Nepal", DateOccured="April 25, 2015" },
            new Earthquake{Place="Taiwan", DateOccured="April 20, 2015" },
            new Earthquake{Place="Papua New Guinea", DateOccured="March 29, 2015" },
            new Earthquake{Place="Flores Sea", DateOccured="Febdruary 27, 2015" },
            new Earthquake{Place="Mid-Atlantic range", DateOccured="Febdruary 13, 2015" }
        };
        lvw = FindViewById<ListView>(Resource.Id.lvwEarthquakes);
        btnadd = FindViewById<Button>(Resource.Id.button1);
        btnadd.Click += Btnadd_Click;
        listadapter= new EarthquakeListAdapter(this, earthquakes);
        lvw.Adapter = listadapter;
        lvw.ItemLongClick += Lvw_ItemLongClick; ;
        lvw.ItemClick += Lvw_ItemClick;
    }
    protected override void OnResume()
    {
        Log.Debug("OnResume", "OnResume called, app is ready to interact with the user");
        base.OnResume();
        listadapter = new EarthquakeListAdapter(this, earthquakes);
        lvw.Adapter = listadapter;
    }

    private void Lvw_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
    {
        var item = earthquakes[e.Position];
        MainActivity.earthquakes.Remove(item);
        List<Earthquake> items = MainActivity.earthquakes;
        listadapter = new EarthquakeListAdapter(this, earthquakes);
        lvw.Adapter = listadapter;

    }

    private void Lvw_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
    {
        Intent intent = new Intent(this, typeof(editActivity));
        //Earthquake temp = MainActivity.earthquakes[e.Position];
        string position = e.Position.ToString();
        intent.PutExtra("p", position);
        StartActivity(intent);
    }

  

 

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

public class Earthquake
{
    public string Place { get; set; }
    public string DateOccured { get; set; }
}

 public class EarthquakeListAdapter : BaseAdapter<Earthquake>
{

    List<Earthquake> earthquakes;
    Activity context;

    /// <summary>
    /// Constructor 
    /// </summary>
    /// <param name="context"></param>
    /// <param name="earthquakeList"></param>
    public EarthquakeListAdapter(Activity currentContext, List<Earthquake> earthquakeList) : base()
    {
        this.earthquakes = earthquakeList;
        this.context = currentContext;
    }

    public override Earthquake this[int position]
    {
        get { return earthquakes.ToArray()[position]; }
    }

    public override int Count
    {
        get { return earthquakes.Count; }
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView;
        if (view == null)
        {
            view = context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem2, null);
            view.FindViewById<TextView>(Android.Resource.Id.Text1).Text = earthquakes.ToArray()[position].Place;
            view.FindViewById<TextView>(Android.Resource.Id.Text2).Text = earthquakes.ToArray()[position].DateOccured;
        }
        return view;
    }

   
}

 public class editActivity : Activity
{
    EditText edittext1;
    EditText edittext2;
    int position;
    Button button;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.editlayout1);
        // Create your application here
        edittext1 = FindViewById<EditText>(Resource.Id.editText1);
        edittext2 = FindViewById<EditText>(Resource.Id.editText2);
        button = FindViewById<Button>(Resource.Id.button1);
        button.Click += Butto1_Click;

        string text = Intent.GetStringExtra("p");
       position = Convert.ToInt32(text);
        edittext1.Text = MainActivity.earthquakes[position].Place;
        edittext2.Text = MainActivity.earthquakes[position].DateOccured;
    }

    private void Butto1_Click(object sender, EventArgs e)
    {
        MainActivity.earthquakes[position] = new Earthquake() { Place = edittext1.Text, DateOccured = edittext2.Text };

        OnBackPressed();
       
    }
}