2012-10-30 133 views
0

您好我必須開發listview與加載更多的按鈕,在android應用程序中使用xml解析。android listview loadmore按鈕與XML解析

這裏我遇到了一些問題。

我的xml feed是空的意味着如何隱藏最後一頁上的加載更多按鈕。

我在這裏使用了下面的代碼。

public class CustomizedListView extends Activity { 
// All static variables 
private String URL = "http://dev.mmm.com/xctesting/xcart444pro/retrieve.php?page=1"; 
// XML node keys 
static final String KEY_SONG = "Order"; 
    static final String KEY_TITLE = "orderid"; 
static final String KEY_DATE = "date"; 
static final String KEY_ARTIST = "payment_method"; 
    int current_page = 1; 
ListView lv; 
LazyAdapter adapter; 
ProgressDialog pDialog; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    lv = (ListView) findViewById(R.id.list); 

    ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

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

    NodeList nl = doc.getElementsByTagName(KEY_SONG); 
    // looping through all song nodes <song> 
    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_TITLE, parser.getValue(e, KEY_TITLE)); 
     map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST)); 
       songsList.add(map); 
    } 

    Button btnLoadMore = new Button(this); 
    btnLoadMore.setText("Load More"); 

    btnLoadMore.setBackgroundResource(R.drawable.lgnbttn); 
    // Adding Load More button to lisview at bottom 
    lv.addFooterView(btnLoadMore); 

    // Getting adapter 
    adapter = new LazyAdapter(this, songsList); 
    lv.setAdapter(adapter); 
       btnLoadMore.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // Starting a new async task 
      new loadMoreListView().execute(); 
     } 
    }); 
} 
    private class loadMoreListView extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      // Showing progress dialog before sending http request 
      pDialog = new ProgressDialog(
        CustomizedListView.this); 
      pDialog.setMessage("Please wait.."); 
      //pDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.my_progress_indeterminate)); 
      pDialog.setIndeterminate(true); 
      pDialog.setCancelable(false); 
      pDialog.show(); 

      pDialog.setContentView(R.layout.custom_dialog); 


     } 
     protected Void doInBackground(Void... unused) { 

        current_page += 1; 

        // Next page request 
        URL = "http://dev.mmm.com/xctesting/xcart444pro/retrieve.php?page=" + current_page; 

        ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

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

        NodeList nl = doc.getElementsByTagName(KEY_SONG); 


        NodeList nl = doc.getElementsByTagName(KEY_SONG); 
        if (nl.getLength() == 0) 
         { 
          btnLoadMore.setVisibility(View.GONE); 
          pDialog.dismiss(); 

         } 
         else 

        // 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_TITLE, parser.getValue(e, KEY_TITLE)); 
         map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST)); 
       songsList.add(map); 
        } 

        // get listview current position - used to maintain scroll position 
        int currentPosition = lv.getFirstVisiblePosition(); 

        // Appending new data to menuItems ArrayList 
        adapter = new LazyAdapter(
          CustomizedListView.this, 
          songsList); 
        lv.setAdapter(adapter); 
      lv.setSelectionFromTop(currentPosition + 1, 0); 


      } 
      }); 

      return (null); 
     } 


     protected void onPostExecute(Void unused) { 
      // closing progress dialog 
      pDialog.dismiss(); 

     } 
    } 
} 

編輯:

在這裏,我必須運行該應用裝置列表視圖顯示在具有1 perpage 4 items.my最後一頁item.please參閱此屏幕截圖:lastpage 在最後一頁我必須按負載更多按鈕意味着必須去下一個活動和成功地隱藏空頁上的按鈕..please參考這個截圖:empty page-so hide the button

我要檢查conditi對空頁:

if (nl.getLength() == 0) 
        { 
         btnLoadMore.setVisibility(View.GONE); 
         pDialog.dismiss(); 

        } 

我怎麼能寫conditon FOT最後一頁?????認罪ehelp我

這裏我想需要的O/P是隱藏最後一頁上的按鈕

請幫助我。我可以檢查一下情況。以編程方式提供一些代碼。

回答

1

第一關爲什麼在AsyncTaks中使用runOnUiThread?這不應該是必要的。必須在後臺運行的代碼在doInBackground方法中就足夠了。

此外,您可以使用AsyncTask的第三個參數類型將結果從te doInBackground返回到onPostExecute。然後根據結果,您可以更改該按鈕的可見性。

爲此,對Button(btnLoadMore)的引用應該是一個實例變量,所以它應該在類中定義,而不是在onCreate方法中定義。否則,將不能從此方法外部訪問。

如果feed爲空時,asume the nodelist將爲空?然後它會看起來像這樣:

public class CustomizedListView extends Activity { 

    private Button btnLoadMore; 

    public void onCreate(){ 
     btnLoadMore = new Button(this); 
     <do stuff> 
     btnLoadMore.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Starting a new async task 
       new LoadMoreListView().execute(); 
      } 
     }); 

     new LoadMoreListView().execute();// execute the AsyncTask once in the onCreate, so you don't have to duplicate the code here to load the listview. 

    } 

    private class LoadMoreListView extends AsyncTask<Void, Void, Boolean> { 

     @Override 
     protected void onPreExecute() { 
      < Show dialog>; 
     } 

     @Override 
     protected Void doInBackground(Void... unused) { 
      Boolean listIsEmpty; 

      < Page request>; 
      < Retrieve element list>; 
      < If element list size == 0, listIsEmpty = true; return listIsEmpty>; 

      < Process elements, fill list etc.>; 
      < End of doInBackground, listIsEmpty = false; return listIsEmpty>; 

     } 

     @Override 
     protected void onPostExecute(Boolean listIsEmpty) { 
      < If listIsEmpty == true -> btnLoadMore.setVisibility(View.GONE);> 
      < Close dialog> 
     } 
    } 
} 
} 
+0

只需檢查元素列表是否爲空,或者不在NodeList下方nl = doc.getElementsByTagName(KEY_SONG); :如果(nl.getLenght()== 0)return listIsEmpty = true – NickL

+0

那不是你的完整代碼我認爲,按鈕仍然在onCreate方法中定義,因此無法從AsyncTask訪問。你現在也有兩個onPostExecute方法,只有帶有布爾參數的方法被調用..所以將dismissDialog移動到這個方法。此外,您將listIsEmpty布爾值初始化爲true,這應該是false。因爲您應該在檢查後只將其設置爲true,以確定列表是否爲空。它現在總是會返回true。你在正確的軌道上。 – NickL

+0

感謝給了一個不錯的idea.thanks.it對我有幫助。 – user1780331

1

我實現負載更採用這種方式我不使用頁腳視圖它

public boolean mHasLoadMore = false; 

    class MyAdapter extends ArrayAdapter implements OnItemClickListener{ 

     public MyAdapter(Context context, int textViewResourceId) { 
      super(context, textViewResourceId); 
      // TODO Auto-generated constructor stub 
     } 

     public int getTotal(){ 
      return super.getCount(); 
     } 
     @Override 
     public int getCount() { 

      if(super.getCount()>0) 
       return super.getCount()+1; 
      else 
       return 0; 

     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      if(getTotal() == (position+1) && mHasLoadMore){ 

       TextView loadMoreView = new TextView(getContext()); 
       loadMoreView.setText("Load More"); 
       return loadMoreView; 
      }    
      else { 
       View theView = new View(getContext()); 
       // inflate & add what you need for item view here you can modify it to reuse convertView also 
       return theView; 
      } 

     } 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
       long id) { 

      if(getTotal() == (position+1) && mHasLoadMore){ 

       // load more button clicked do handling for load more launch async 
       //task to do load more after that if found 0 result change mHasLoadMore to false 
       //& call notifydatadetchanged    
      } 
      else 
      { 
       // handle item click here 
      } 

     } 



    } 

使用的mHasLoadMore第一次你的ListView &設定值這樣的適配器在加載數據&呼叫notifydatasetchanged

+1

這是一個loadMore按鈕(或者更可點擊的textview)在列表視圖的底部?這不是他認爲的問題的答案,他也想知道如何檢查條件並將更改傳遞給UI。但仍然是一個loadMore按鈕的不錯方法。 – NickL

+1

哎呀,完全錯過了它在OP的部分,就像在你的例子中那樣,在LV的底部有一個按鈕。 – NickL

+0

謝謝@NickL我只是展示了可選方式 –