2015-03-08 3 views
0

У меня есть listview с некоторыми статическими данными. Когда операция обновления завершена, некоторые данные необходимо обновить в listview. Проблема заключается в том, что обновление будет завершено, новые элементы не будут обновлены.Обновление списка для обновления данных?

MainActivity.class

public class MainActivity extends ActionBarActivity { 

SwipeRefreshLayout swipeLayout; 
String[] players = {"Dravid","Ganguly","Sachin","Irfan pathan","Balaji","Bhuvi","Praveen"}; 
ListView listView; 
ArrayAdapter<String> adapter = null; 
ArrayList al = new ArrayList(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listView = (ListView)findViewById(R.id.listView); 


    for (int i =0; i<players.length; i++) 
    { 
     Bean b = new Bean(); 
     b.setName(players[i]); 
     al.add(b); 
    } 

    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,players); 
    listView.setAdapter(adapter); 

    swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); 
    swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 

      swipeLayout.setRefreshing(true); 
      new updateItems().execute(); 
     } 

    }); 

    swipeLayout.setColorScheme(android.R.color.holo_blue_bright, 
      android.R.color.holo_green_light, 
      android.R.color.holo_orange_light, 
      android.R.color.holo_red_light); 
} 

class updateItems extends AsyncTask<Void, Void, Void> 
{ 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     String[] newitems = {"Ishant sharma","Ramesh power","Kaif"}; 
     // adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,newitems); 


     for (int j=0;j<newitems.length;j++) 
     { 
      Bean bb = new Bean(); 
      bb.setName(newitems[j]); 
      al.add(bb); 

     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 



     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       adapter.notifyDataSetChanged(); 
       listView.invalidateViews(); 
      } 
     }); 



     swipeLayout.setRefreshing(false); 
    } 
} 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

Bean.class

public class Bean { 

String name; 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 
} 

Где я делаю ошибку?

ответ

2

Это что вы устанавливаете изначально адаптер:

adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,players); 

Внутри вашего метода doInBackground() вы обновите a1 ArrayList, но ваши игроки массива, от которых зависит адаптер остается неизменным, следовательно, никаких изменений не отражаются в список, даже если вы делаете adapter.notifyDataSetChanged().

Во-вторых, метод onPostExecute работает по линии ui, поэтому вам не нужно явно это делать.

+0

Итак, что мне теперь делать, чтобы обновлять новые предметы? – user3289108

+0

Вам нужно добавить новые элементы в массив игроков. –

+0

О, да .. я получил это сейчас. – user3289108

Смежные вопросы