Java 如何刷新Android列表适配器,以便显示新添加的项目
我在做一个项目。它只是显示任务列表并向其中添加新任务。我有三节课。一个用于添加,一个用于查看,一个用于保存所有信息(或者我认为是这样) 我的列表中已经有2个任务,它们都正确显示了 问题是,当我添加新任务时,它不会在视图中显示它们。我尝试了许多可能的解决方案:Java 如何刷新Android列表适配器,以便显示新添加的项目,java,android,android-arrayadapter,Java,Android,Android Arrayadapter,我在做一个项目。它只是显示任务列表并向其中添加新任务。我有三节课。一个用于添加,一个用于查看,一个用于保存所有信息(或者我认为是这样) 我的列表中已经有2个任务,它们都正确显示了 问题是,当我添加新任务时,它不会在视图中显示它们。我尝试了许多可能的解决方案: 只需将项目添加到列表中 创建一个新列表,其中包含旧列表中的项目并重新生成适配器 使用notifyDataSetChanged()与add()命令一起使用 等等 这是我的代码,有点乱,但我希望你能理解 AndroidListAdapter
- 只需将项目添加到列表中
- 创建一个新列表,其中包含旧列表中的项目并重新生成适配器
- 使用
与add()命令一起使用notifyDataSetChanged()
- 等等
public class AndroidListAdapterActivity extends ListActivity {
/** Called when the activity is first created. */
Button b1;
Lista o;
ArrayAdapter aa;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b1=(Button)findViewById(R.id.add);
Log.w("POC", "PA OVO SE ZOVE SVAKI PUT");
o=new Lista();
o.lis.add("S1");
o.lis.add("S2");
aa = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, o.lis);
setListAdapter(aa);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(AndroidListAdapterActivity.this, Dodavanje.class);
startActivity(i);
}
});
}
@Override
public void onResume(){
super.onResume();
aa.notifyDataSetChanged();
if(o.broj>=2){
aa=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, o.lis2);
setListAdapter(aa);
Log.w("myApp", "CALLED TOO");
}
String yt=String.valueOf(o.ses);
Log.w("teras", yt);
aa.notifyDataSetChanged();
Log.w("myApp", "CaLLED!!!!!!!!!!!!!");
String fx= String.valueOf(o.broj);
Log.w("myAPPe", fx);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
}
public class Dodavanje extends Activity {
Button but;
Button but2;
EditText et;
Lista o;
AndroidListAdapterActivity www;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.dodavanje);
but= (Button)findViewById(R.id.bb);
but2= (Button)findViewById(R.id.bc);
et=(EditText)findViewById(R.id.tt);
www=new AndroidListAdapterActivity();
o = new Lista();
but.setOnClickListener(new View.OnClickListener() {
@SuppressWarnings("unchecked")
@Override
public void onClick(View arg0) {
String t1= et.getText().toString();
//o.lis.add(t1);
o.lis2.addAll(o.lis);
o.lis2.add(t1);
o.lis.add(t1);
o.ses=true;
Log.w("IZVJESTAJ: ", String.valueOf(o.ses));
o.broj++;
String fx=String.valueOf(o.broj);
Log.w("Izbacaj",fx);
et.setText("");
}
});
but2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
finish();
}
});
}
}
public class Lista extends Application {
ArrayList<String> lis=new ArrayList<String>();
ArrayList<String> lis2=new ArrayList<String>();
int broj =1;
boolean ses= false;
}
Lista(列表):
public class AndroidListAdapterActivity extends ListActivity {
/** Called when the activity is first created. */
Button b1;
Lista o;
ArrayAdapter aa;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b1=(Button)findViewById(R.id.add);
Log.w("POC", "PA OVO SE ZOVE SVAKI PUT");
o=new Lista();
o.lis.add("S1");
o.lis.add("S2");
aa = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, o.lis);
setListAdapter(aa);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(AndroidListAdapterActivity.this, Dodavanje.class);
startActivity(i);
}
});
}
@Override
public void onResume(){
super.onResume();
aa.notifyDataSetChanged();
if(o.broj>=2){
aa=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, o.lis2);
setListAdapter(aa);
Log.w("myApp", "CALLED TOO");
}
String yt=String.valueOf(o.ses);
Log.w("teras", yt);
aa.notifyDataSetChanged();
Log.w("myApp", "CaLLED!!!!!!!!!!!!!");
String fx= String.valueOf(o.broj);
Log.w("myAPPe", fx);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
}
public class Dodavanje extends Activity {
Button but;
Button but2;
EditText et;
Lista o;
AndroidListAdapterActivity www;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.dodavanje);
but= (Button)findViewById(R.id.bb);
but2= (Button)findViewById(R.id.bc);
et=(EditText)findViewById(R.id.tt);
www=new AndroidListAdapterActivity();
o = new Lista();
but.setOnClickListener(new View.OnClickListener() {
@SuppressWarnings("unchecked")
@Override
public void onClick(View arg0) {
String t1= et.getText().toString();
//o.lis.add(t1);
o.lis2.addAll(o.lis);
o.lis2.add(t1);
o.lis.add(t1);
o.ses=true;
Log.w("IZVJESTAJ: ", String.valueOf(o.ses));
o.broj++;
String fx=String.valueOf(o.broj);
Log.w("Izbacaj",fx);
et.setText("");
}
});
but2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
finish();
}
});
}
}
public class Lista extends Application {
ArrayList<String> lis=new ArrayList<String>();
ArrayList<String> lis2=new ArrayList<String>();
int broj =1;
boolean ses= false;
}
公共类Lista扩展了应用程序{
ArrayList lis=新的ArrayList();
ArrayList lis2=新的ArrayList();
int-broj=1;
布尔ses=false;
}
每次数据更改时都必须使用
aa.notifyDataSetChanged();
可以使用notifyDataSetChanged()方法更新listview。在您的情况下,可以使用
aa.notifyDataSetChanged();
请这边试试
public class MainActivity extends Activity {
ListView lView;
Button btnAdd;
private ListView mainListView ;
private ArrayAdapter<String> listAdapter ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainListView = (ListView) findViewById( R.id.listView1 );
btnAdd = (Button)findViewById(R.id.button1);
// Create and populate a List of alphabet names.
String[] alphabets = new String[] { "A", "B", "C", "D",
"E", "F", "G", "H"};
ArrayList<String> alphabetsList= new ArrayList<String>();
alphabetsList.addAll( Arrays.asList(alphabets) );
// Create ArrayAdapter using the for the list.
listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, alphabetsList);
// Set the ArrayAdapter as the ListView's adapter.
mainListView.setAdapter( listAdapter );
btnAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
// Here I am adding more alphabets in the list on the listener of add button.
listAdapter.add( "I" );
listAdapter.add( "J" );
listAdapter.add( "K" );
listAdapter.add( "L" );
listAdapter.add( "M" );
}
});
}
}
公共类MainActivity扩展活动{
列表视图lView;
按钮btnAdd;
私有ListView主ListView;
专用阵列适配器列表适配器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainListView=(ListView)findViewById(R.id.listView1);
btnAdd=(按钮)findviewbyd(R.id.button1);
//创建并填充字母表名称列表。
字符串[]字母=新字符串[]{“A”、“B”、“C”、“D”,
“E”、“F”、“G”、“H”};
ArrayList alphabetsList=新的ArrayList();
alphabetsList.addAll(Arrays.asList(alphabets));
//使用列表的创建ArrayAdapter。
listAdapter=new ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,alphabetsList);
//将ArrayAdapter设置为ListView的适配器。
mainListView.setAdapter(listAdapter);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
//在这里,我在添加按钮的侦听器的列表中添加了更多字母。
列表适配器。添加(“I”);
添加(“J”);
添加(“K”);
添加(“L”);
添加(“M”);
}
});
}
}
扩展BaseAdapter
类,重写notifyDataSetChanged()代码>方法。
请参见以下snip代码:
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
list.addAll();//--insert object to list
}
调用notifyDataSetChanged()Activity onResume()
方法中的code>method,如下所示:
@Override
protected void onResume() {
super.onResume();
((BaseAdapter)getListAdapter()).notifyDataSetChanged();
}
到目前为止提出的解决方案是可行的,但取决于设备的Android版本。例如,要使用AddAll方法,您必须将android:minSdkVersion=“10”放入您的android设备中
为了解决所有设备的这个问题,我在适配器中创建了自己的方法,并在从ArrayAdapter继承的添加和删除方法中使用,该方法可以毫无问题地更新数据
我的代码:使用我自己的数据类RaceResult,您可以使用自己的数据模型
ResultGpRowAdapter.java
public class ResultGpRowAdapter extends ArrayAdapter<RaceResult> {
Context context;
int resource;
List<RaceResult> data=null;
public ResultGpRowAdapter(Context context, int resource, List<RaceResult> objects) {
super(context, resource, objects);
this.context = context;
this.resource = resource;
this.data = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
........
}
//my own method to populate data
public void myAddAll(List<RaceResult> items) {
for (RaceResult item:items){
super.add(item);
}
}
公共类ResultGpRowAdapter扩展了ArrayAdapter{
语境;
智力资源;
列表数据=null;
public ResultGpRowAdapter(上下文上下文、int资源、列表对象){
超级(上下文、资源、对象);
this.context=上下文;
这个资源=资源;
这个数据=对象;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
........
}
//我自己填充数据的方法
公共作废myAddAll(列表项){
用于(结果项:项){
超级。添加(项目);
}
}
ResultsGp.java
public class ResultsGp extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...........
...........
ListView list = (ListView)findViewById(R.id.resultsGpList);
ResultGpRowAdapter adapter = new ResultGpRowAdapter(this, R.layout.activity_result_gp_row, new ArrayList<RaceResult>()); //Empty data
list.setAdapter(adapter);
....
....
....
//LOAD a ArrayList<RaceResult> with data
ArrayList<RaceResult> data = new ArrayList<RaceResult>();
data.add(new RaceResult(....));
data.add(new RaceResult(....));
.......
adapter.myAddAll(data); //Your list will be udpdated!!!
公共类ResultsGp扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...........
...........
ListView列表=(ListView)findViewById(R.id.resultsGpList);
ResultGpRowAdapter adapter=new ResultGpRowAdapter(此,R.layout.activity\u result\u gp\u行,new ArrayList());//空数据
list.setAdapter(适配器);
....
....
....
//用数据加载ArrayList
ArrayList数据=新的ArrayList();
添加数据(新结果(..);
添加数据(新结果(..);
.......
adapter.myAddAll(数据);//您的列表将被更新!!!
@user1462326我已更改了我的帖子。请看一看。尝试这种方式,而不是让事情完成。并让我知道结果。我看到了你在那里做了什么。我知道这个练习。唯一的区别是我正在使用另一个活动添加新项目。活动,它有自己的观点。我理解你的代码,很简单,我做过类似的事情很多次。但在这种情况下,事情并不顺利