Ответ 1
Вы должны использовать каждый раз при изменении данных.
aa.notifyDataSetChanged();
Я работал над проектом. Он просто показывает список задач и добавляет к нему новые задачи. У меня 3 КЛАССА. Один для добавления: "Один для просмотра" и "Один" для хранения всей информации (или, как я полагаю).
У меня уже есть 2 задания в моем списке, и они отображаются правильно.
Проблема в том, что когда я добавлю новую задачу, она не покажет их в поле зрения. Я пробовал много возможных решений:
просто добавьте элемент в список
создание нового списка, состоящего из элементов старого и перестраивающего адаптера;
используя notifyDataSetChanged();
вместе с командой add();
и др.
Вот мой код, это немного грязно, но я надеюсь, что вы это выясните.
Класс AndroidListAdapterActivity:
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;
}
Вы должны использовать каждый раз при изменении данных.
aa.notifyDataSetChanged();
Вы можете использовать метод notifyDataSetChanged() для обновления списка. В вашем случае вы можете использовать.
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 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" );
}
});
}
}
extends BaseAdapter
, переопределить метод notifyDataSetChanged();
.
Ниже приведен снип-код:
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
list.addAll();//--insert object to list
}
вызывать метод notifyDataSetChanged();
в методе Activity onResume()
, например:
@Override
protected void onResume() {
super.onResume();
((BaseAdapter)getListAdapter()).notifyDataSetChanged();
}
Решения, предлагаемые к настоящему времени, работают, но зависят от версии вашего устройства Android. Например, чтобы использовать метод AddAll, вы должны поместить android: minSdkVersion = "10" в ваше устройство Android.
Чтобы решить эти вопросы для всех устройств, я создал свой собственный метод в своем адаптере и использование внутри метода add и remove наследует от 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);
}
}
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!!!