2013-09-12 2 views
0

Возможно ли перезагрузить ListView после загрузки данных? В основном я обновляю приложение для 4.1, но мой ListView загружает и анализирует XML-файл, я знаю, что мне нужно запустить это сейчас в фоновом потоке, но когда я открываю действие через вкладку, экран пуст. Я не уверен, как заставить это работать или какую часть кода мне нужно использовать в фоновом потоке, может кто-то поможет. Спасибо.Android ListView перезагружает данные

public class ThirdActivity extends ListActivity { 

    // All static variables 
    static final String URL = "http://selectukradio.com/SelectUKSchedule.xml";  // http://api.androidhive.info/pizza/?format=xml http://selectukradio.com/SelectUKSchedule.xml 
    // XML node keys 
    static final String KEY_ITEM = "day"; // parent node item 
    static final String KEY_ID = "link";  // id 
    static final String KEY_NAME = "dj";  // name 
    static final String KEY_COST = "time"; // cost 
    static final String KEY_DESC = "tempDay"; // description 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_3); 


        try{ 
        ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

        XMLParser parser = new XMLParser(); 
        String xml = parser.getXmlFromUrl(URL); // getting XML 
        Document doc = parser.getDomElement(xml); // getting DOM element 


        NodeList nl = doc.getElementsByTagName(KEY_ITEM); 
        // looping through all item nodes <item> 
        for (int i = 0; i < nl.getLength(); i++) { 
         // creating new HashMap 
         HashMap<String, String> map = new HashMap<String, String>(); 
         Element e = (Element) nl.item(i); 
         // adding each child node to HashMap key => value 
         map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
         map.put(KEY_NAME, parser.getValue(e, KEY_NAME)); 
         map.put(KEY_COST, parser.getValue(e, KEY_COST)); // "Rs. " + 
         map.put(KEY_DESC, parser.getValue(e, KEY_DESC)); 

         // adding HashList to ArrayList 
         menuItems.add(map); 
        } 

        // Adding menuItems to ListView 
        ListAdapter adapter = new SimpleAdapter(ThirdActivity.this, menuItems, 
          R.layout.list_item, 
          new String[] { KEY_NAME, KEY_COST,KEY_DESC,KEY_ID }, new int[] { 
            R.id.name, R.id.cost, R.id.day, R.id.link }); 



        setListAdapter(adapter); 

        // selecting single ListView item 
        ListView lv = getListView(); 

        lv.setOnItemClickListener(new OnItemClickListener() { 

         @Override 
         public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 
          // getting values from selected ListItem 
          String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
          String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString(); 
          String link = ((TextView) view.findViewById(R.id.link)).getText().toString(); 



          // Starting new intent 
          Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class); 
          in.putExtra(KEY_NAME, name); 
          in.putExtra(KEY_COST, cost); 
          in.putExtra(KEY_ID, link); 
          startActivity(in); 

         } 
        }); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

    } 




    @Override public boolean onKeyDown(int keyCode, KeyEvent event) { 


     if (keyCode == KeyEvent.KEYCODE_BACK) {    
      Intent intent = new Intent(); 
      intent.setAction(Intent.ACTION_MAIN); 
      intent.addCategory(Intent.CATEGORY_HOME); 
      startActivity(intent); 
      }  

     return super.onKeyDown(keyCode, event); 
     } 
} 
+3

listview.notifyDataSetChanged(); – Nick

+0

спасибо за ответ, но я не могу получить это для работы, я могу решить это, установив minSDK на 8, это боль на обратной стороне – Pulsarman325

+0

что-то подобное после загрузки всех данных 'listview.setAdapter (новый YourAdapter()) ' – deadfish

ответ

2

комментарий Ника имеет upvotes но каждый забывает, что notifyDataSetChanged() должен быть вызван на адаптера, а не на экране списка.

В этом примере вы используете SimpleAdapter, который принимает список элементов в конструкторе. Чтобы изменить данные, обернутые адаптером, вам необходимо обновить этот список, а затем вызвать notifyDataSetChanged() на адаптере, чтобы получить представление списка для обновления.

Вот как вы можете переделать код, чтобы решить свои проблемы. Все, что я сделал, это переместить код загрузки XML в AsyncTask и переместить атрибут списка и элементы данных в переменные экземпляра, чтобы вы могли получить к ним доступ, когда задача async завершена.

Пожалуйста, обратите внимание, что я не тестировал этот код, но он должен дать вам правильную идею!

public class ThirdActivity extends ListActivity { 

    // All static variables 
    static final String URL = "http://selectukradio.com/SelectUKSchedule.xml";  // http://api.androidhive.info/pizza/?format=xml http://selectukradio.com/SelectUKSchedule.xml 
    // XML node keys 
    static final String KEY_ITEM = "day"; // parent node item 
    static final String KEY_ID = "link";  // id 
    static final String KEY_NAME = "dj";  // name 
    static final String KEY_COST = "time"; // cost 
    static final String KEY_DESC = "tempDay"; // description 

    // Initially set list of items to empty array 
    ArrayList<HashMap<String, String>> mMenuItems = new ArrayList<HashMap<String, String>>(); 
    SimpleAdapter mAdapter; 
    UpdateTask mUpdateTask; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_3); 

     // Adding menuItems to ListView 
     mAdapter = new SimpleAdapter(ThirdActivity.this, mMenuItems, 
       R.layout.list_item, 
       new String[] { KEY_NAME, KEY_COST,KEY_DESC,KEY_ID }, 
       new int[] { R.id.name, R.id.cost, R.id.day, R.id.link }); 
     setListAdapter(mAdapter); 

     // selecting single ListView item 
     ListView lv = getListView(); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       // getting values from selected ListItem 
       String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
       String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString(); 
       String link = ((TextView) view.findViewById(R.id.link)).getText().toString(); 

       // Starting new intent 
       Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class); 
       in.putExtra(KEY_NAME, name); 
       in.putExtra(KEY_COST, cost); 
       in.putExtra(KEY_ID, link); 
       startActivity(in); 
      } 
     }); 

     // Start an update 
     updateMenuItems(); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) {    
      Intent intent = new Intent(); 
      intent.setAction(Intent.ACTION_MAIN); 
      intent.addCategory(Intent.CATEGORY_HOME); 
      startActivity(intent); 
      return true; // handled event 
     }  
     return super.onKeyDown(keyCode, event); 
    } 

    // Call this method to download latest XML file from network and update listview 
    private void updateMenuItems() { 
     if (mUpdateTask == null) { 
      mUpdateTask = new UpdateTask(); 
      mUpdateTask.execute(URL); 
     } 
    } 

    // Async task to download XML on background thread 
    private class UpdateTask extends AsyncTask<String, Void, String> { 

     // This method runs on a background. 
     // Do network operation and returns XML parser, or null on exception 
     protected String doInBackground(String... url) { 
      try { 
       XMLParser parser = new XMLParser(); 
       return parser.getXmlFromUrl(url[0]); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 

     // This method runs on the main thread when the async task completes. 
     // Make sure you only update your UI from this method! 
     protected void onPostExecute(String xml) { 
      if (xml == null) { 
       // Download failed, display error message or something 
       return; 
      } 

      XMLParser parser = new XMLParser(); 
      Document doc = parser.getDomElement(xml); // getting DOM element 
      NodeList nl = doc.getElementsByTagName(KEY_ITEM); 

      // looping through all item nodes <item> 
      mMenuItems.clear(); 
      for (int i = 0; i < nl.getLength(); i++) { 
       // creating new HashMap 
       HashMap<String, String> map = new HashMap<String, String>(); 
       Element e = (Element) nl.item(i); 
       // adding each child node to HashMap key => value 
       map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
       map.put(KEY_NAME, parser.getValue(e, KEY_NAME)); 
       map.put(KEY_COST, parser.getValue(e, KEY_COST)); // "Rs. " + 
       map.put(KEY_DESC, parser.getValue(e, KEY_DESC)); 

       // adding HashList to ArrayList 
       mMenuItems.add(map); 
      } 

      // all done, notify listview adapter to update 
      mAdapter.notifyDataSetChanged(); 
     } 
    } 
} 
+0

Вау, большое спасибо, я дам вам попробовать и поделиться результатами с вами. – Pulsarman325

+0

Эта строка - mUpdateTask.execute (URL); дает AsyncTask Невозможно решить тип. Кроме того, эта линия - частный класс UpdateTask расширяет AsyncTask дает несколько маркеров на этой линии \t - URL не может быть разрешен к типу \t - Тип ThirdActivity.UpdateTask должен реализовать унаследованный абстрактный \t метод AsyncTask < URL, Void, XMLParser> .doInBackground (URL ...) – Pulsarman325

+0

и, наконец, эта защищенная XMLParser doInBackground (URL ... url) дает несколько маркеров в этой строке \t - реализует \t android.os.AsyncTask .doInBackground \t - URL-адрес не может быть разрешен для типа. Извините, если мне не хватает очевидного – Pulsarman325

0

Вот окончательный класс

public class ThirdActivity extends ListActivity { 

// All static variables 
static final String URL = "http://selectukradio.com/SelectUKSchedule.xml";  // http://api.androidhive.info/pizza/?format=xml http://selectukradio.com/SelectUKSchedule.xml 
// XML node keys 
static final String KEY_ITEM = "day"; // parent node item 
static final String KEY_ID = "link";  // id 
static final String KEY_NAME = "dj";  // name 
static final String KEY_COST = "time"; // cost 
static final String KEY_DESC = "tempDay"; // description 

String xml = new String(); 

// Initially set list of items to empty array 
ArrayList<HashMap<String, String>> mMenuItems = new ArrayList<HashMap<String, String>>(); 
SimpleAdapter mAdapter; 
UpdateTask mUpdateTask; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_3); 

    // Adding menuItems to ListView 
    mAdapter = new SimpleAdapter(ThirdActivity.this, mMenuItems, 
      R.layout.list_item, 
      new String[] { KEY_NAME, KEY_COST,KEY_DESC,KEY_ID }, 
      new int[] { R.id.name, R.id.cost, R.id.day, R.id.link }); 
    setListAdapter(mAdapter); 

    // selecting single ListView item 
    ListView lv = getListView(); 
    lv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      // getting values from selected ListItem 
      String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
      String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString(); 
      String link = ((TextView) view.findViewById(R.id.link)).getText().toString(); 

      // Starting new intent 
      Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class); 
      in.putExtra(KEY_NAME, name); 
      in.putExtra(KEY_COST, cost); 
      in.putExtra(KEY_ID, link); 
      startActivity(in); 
     } 
    }); 

    // Start an update 
    updateMenuItems(); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) {    
     Intent intent = new Intent(); 
     intent.setAction(Intent.ACTION_MAIN); 
     intent.addCategory(Intent.CATEGORY_HOME); 
     startActivity(intent); 
     return true; // handled event 
    }  
    return super.onKeyDown(keyCode, event); 
} 

// Call this method to download latest XML file from network and update listview 
private void updateMenuItems() { 
    if (mUpdateTask == null) { 
     mUpdateTask = new UpdateTask(); 
     mUpdateTask.execute(URL); 
    } 
} 

// Async task to download XML on background thread 
private class UpdateTask extends AsyncTask<String, Void, XMLParser> { 

    // This method runs on a background. 
    // Do network operation and returns XML parser, or null on exception 
    protected XMLParser doInBackground(String... url) { 
     try { 
      XMLParser parser = new XMLParser(); 
      xml = parser.getXmlFromUrl(url[0]); 
     // xml = parser.getXmlFromUrl(URL); // getting XML 
      return parser; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    // This method runs on the main thread when the async task completes. 
    // Make sure you only update your UI from this method! 
    protected void onPostExecute(XMLParser parser) { 
     if (parser == null) { 
      // Download failed, display error message or something 
      return; 
     } 

    // String xml = parser.getXmlFromUrl(URL); // getting XML 
     Document doc = parser.getDomElement(xml); // getting DOM element 
     NodeList nl = doc.getElementsByTagName(KEY_ITEM); 

     // looping through all item nodes <item> 
     mMenuItems.clear(); 
     for (int i = 0; i < nl.getLength(); i++) { 
      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 
      Element e = (Element) nl.item(i); 
      // adding each child node to HashMap key => value 
      map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
      map.put(KEY_NAME, parser.getValue(e, KEY_NAME)); 
      map.put(KEY_COST, parser.getValue(e, KEY_COST)); // "Rs. " + 
      map.put(KEY_DESC, parser.getValue(e, KEY_DESC)); 

      // adding HashList to ArrayList 
      mMenuItems.add(map); 
     } 

     // all done, notify listview adapter to update 
     mAdapter.notifyDataSetChanged(); 
    } 
} 
} 
+0

Большое спасибо @Alex MDC – Pulsarman325

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