Java 如何在完成上一个活动后刷新活动中的listview?
我的活动之间的互动:Java 如何在完成上一个活动后刷新活动中的listview?,java,android,listview,Java,Android,Listview,我的活动之间的互动: 单击listview.java中listview中的一行> 转到Edit.java编辑有关该特定行的信息> 编辑完成后,单击按钮,将完成edit.java活动> 返回listview.java 但是,从edit.java返回listview.java时,它不会显示以前单击的listview特定行的新更新信息 只有当我离开listview活动并再次返回时,信息才会更新 listview.java: MyItems mi; private ArrayList&l
MyItems mi;
private ArrayList<SalesItemInformationLV> displayiteminfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_sale_item);
mi = MyItems.getInstance();
displayiteminfo = mi.retrieveAllForlist(getApplicationContext());
final ArrayAdapter<SalesItemInformationLV> adapter = new itemArrayAdapter(this, 0, displayiteminfo);
final ListView listView = (ListView)findViewById(R.id.customListview);
listView.setAdapter(adapter);
// adapter.notifyDataSetChanged(); Place this code here but it does not work
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
SalesItemInformationLV saleitem2 = displayiteminfo2.get(info.position);
String namevalue = saleitem2.getItemname();
Double costpvalue = saleitem2.getCostprice();
Double sellpvalue = saleitem2.getSellingprice();
int qtyvalue = saleitem2.getItemquantity();
String datevalue = saleitem2.getDatesold();
int staffvalue = saleitem2.getStaffdiscount();
Intent myintent = new Intent(List.this, Edit.class);
myintent.putExtra("array", saleitem2);
myintent.putExtra("itemname", namevalue);
myintent.putExtra("itemcp", costpvalue);
myintent.putExtra("itemsp", sellpvalue);
myintent.putExtra("itemqty", qtyvalue);
myintent.putExtra("itemds", datevalue);
myintent.putExtra("itemsstaffdis", staffvalue);
startActivity(myintent);
}
// Step 1 (Send data to edit.class)
Intent i = new Intent(this, Edit.class);
startActivityForResult(i, 1);
// Step 3 (Receive new data)
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if(resultCode == RESULT_OK) {
String strEditText = data.getStringExtra("key");
// update your listview in here with new data
}
}
}
mymi;
私有ArrayList displayiteminfo;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u list\u sale\u item);
mi=MyItems.getInstance();
displayiteminfo=mi.retrieveAllForlist(getApplicationContext());
最终ArrayAdapter=new itemArrayAdapter(this,0,displayiteminfo);
最终ListView ListView=(ListView)findViewById(R.id.customListview);
setAdapter(适配器);
//adapter.notifyDataSetChanged();将此代码放在此处,但它不起作用
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
SalesItemInformationLV saleitem2=displayiteminfo2.get(info.position);
字符串namevalue=saleitem2.getItemname();
Double costpvalue=saleitem2.getCostprice();
Double sellpvalue=saleitem2.getSellingprice();
int qtyvalue=saleitem2.getItemquantity();
字符串datevalue=saleitem2.getDateSell();
int staffvalue=saleitem2.getStaffdiscount();
Intent myintent=newintent(List.this,Edit.class);
myintent.putExtra(“数组”,saleitem2);
myintent.putExtra(“itemname”,namevalue);
myintent.putExtra(“itemcp”,成本值);
myintent.putExtra(“itemsp”,sellpvalue);
myintent.putExtra(“项目数量”,数量值);
myintent.putExtra(“itemds”,日期值);
myintent.putExtra(“itemsstaffdis”,staffvalue);
星触觉(myintent);
}
这取决于项目的存储位置(数据库?)以及编辑活动是否将更改保存到数据库。如果是这样,您应该
- 在listview活动中使用
启动编辑活动startActivityForResult()
- 在编辑活动中,用户完成后,使用
和setResult()
返回listview活动finish()
- 在listview活动中使用onActivityResult()检查您是否从编辑活动返回,如果是,则从数据库重新加载数据并使用listview的
notifyDataSetChanged()
这只是一个基本的工作流,可以进行各种优化。下面的代码演示了listview的基本实现 在活动onCreate方法中:
ListView listView = (ListView) findViewById(R.id.list);
// Defined Array values to show in ListView
String[] values = new String[] { "Android List View",
"Adapter",
"Simple List View ",
"Create List View ",
"Android Example",
"List View ",
"Array Adapter",
"Android List View"
};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, values);
listView.setAdapter(adapter);
然后,您将看到listview已更新。实际上,适配器获取数组,然后将该数据发送到listview。listview不直接处理字符串数组。每次您对数组执行某种CRUD操作时,都会调用adapter.notifyDataSetChanged();以使listview反映您所做的更改。在应用过程中,我通常将数组替换为Arraylist,因为这使添加和删除更加容易。存在许多问题。首先,您发送的是该对象的属性,而不是对象本身。最快的方法(可能不是最好的方法)是发送对象(SalesItemInformationLV saleitem2)。为此,该对象需要实现可序列化接口 这是传递可序列化对象的方法: 使用此解决方案非常重要: 然后,在onActivityResult()中,应该调用adapter.notifyDataSetChanged()
请记住将适配器声明为全局属性(在方法之外)。您可以在onResume方法活动中使用
适配器.notifyDataSetChanged();
,但最好使用startActivityForResult
和setResult
方法。步骤1、2和3中的数据流
listview.java:
MyItems mi;
private ArrayList<SalesItemInformationLV> displayiteminfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_sale_item);
mi = MyItems.getInstance();
displayiteminfo = mi.retrieveAllForlist(getApplicationContext());
final ArrayAdapter<SalesItemInformationLV> adapter = new itemArrayAdapter(this, 0, displayiteminfo);
final ListView listView = (ListView)findViewById(R.id.customListview);
listView.setAdapter(adapter);
// adapter.notifyDataSetChanged(); Place this code here but it does not work
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
SalesItemInformationLV saleitem2 = displayiteminfo2.get(info.position);
String namevalue = saleitem2.getItemname();
Double costpvalue = saleitem2.getCostprice();
Double sellpvalue = saleitem2.getSellingprice();
int qtyvalue = saleitem2.getItemquantity();
String datevalue = saleitem2.getDatesold();
int staffvalue = saleitem2.getStaffdiscount();
Intent myintent = new Intent(List.this, Edit.class);
myintent.putExtra("array", saleitem2);
myintent.putExtra("itemname", namevalue);
myintent.putExtra("itemcp", costpvalue);
myintent.putExtra("itemsp", sellpvalue);
myintent.putExtra("itemqty", qtyvalue);
myintent.putExtra("itemds", datevalue);
myintent.putExtra("itemsstaffdis", staffvalue);
startActivity(myintent);
}
// Step 1 (Send data to edit.class)
Intent i = new Intent(this, Edit.class);
startActivityForResult(i, 1);
// Step 3 (Receive new data)
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if(resultCode == RESULT_OK) {
String strEditText = data.getStringExtra("key");
// update your listview in here with new data
}
}
}
Edit.java:
// Step 2 (Edit data in here, and send to listview.java with setResult)
Intent intent = new Intent();
intent.putExtra("key", "value")
setResult(RESULT_OK, intent);
finish();
请向我们展示listview.java和edit.java之间的交互。@LeandroCampo嗨,我已经编辑过了,请看一看谢谢!太好了!!但我需要代码=)。请展示用于交互的代码。@sarah你试过使用adapter.notifyDataSetChanged()吗;编辑该行的一部分对象后?@LeandroOcampo您好!我再次编辑了它!在第一个灰色框中,我已注释掉适配器的放置位置。notifyDataSetChanged()代码。请看一看。谢谢!CRUD操作是在另一个活动中完成的。我如何将适配器传递给另一个活动?@sarah对于Android中的SQLite数据库,您应该使用CursorAdapter显示它们。您没有传递适配器,而是传递光标或数据库对象。嘿,sarah,您尝试过其他完成方法吗活动并按照@cricket_007的建议通过光标传递更改后的数据。我写下了我的答案,以便您了解notifyDataSetChanged是如何工作的。请看Ridcully的答案,以了解如何实际将数据从一个活动传递到另一个活动。您好,我已将saleitem2声明为可序列化的。onActivityResult()是在edit.java或listview.java?listview.java中完成的。还可以在该方法中放置断点,以检查收到的对象是否与发送的对象相同。如果相同,则调用adapter.notifyDataSetChanged();Otherw