简体   繁体   中英

android listview loadmore button with xml parsing

Hi i have to developed listview with load more button using xml parsing in android application.

Here i have faced some problem.

my xml feed is empty means how can hide the load more button on last page.

i have used below code here.

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();

        }
    }
}

EDIT:

Here i have to run the app means the listview is displayed on perpage 4 items.my last page having 1 item.please refer this screenshot: lastpage In last page i have to click the load more button means have to go next activity and successfully hide the button on empty page ..please refer this screenshot: empty page-so hide the button

i have to check the condition for empty page:

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

                    }

How can i write the conditon fot last page?????pleas ehelp me

Here i wish to need the o/p is hide the button on last page .

Please help me.how can i check the condition.give me some code programmatically.

I achieved load more using this way I dont use footer view for it

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  
            }

        }



    } 

Use such adapter for your listview & set value of mHasLoadMore first time while loading data & call notifydatasetchanged

First off, why are you using runOnUiThread inside an AsyncTaks? This should not be necessary. The code that has to run in the background, in the doInBackground method is enough.

Furthermore, you could use the third parameter type of the AsyncTask to return a result from te doInBackground to the onPostExecute. Then depending on the result, you can change the visibility of the button there.

To do this, the reference to the Button (btnLoadMore in your case) should be a instance variable, so it should be defined in the class, not in the onCreate method. Otherwise it will not be accessible from outside this method.

I asume the nodelist will be empty when the feed is empty? Then it will look something like this:

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>
        }
    }
}
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM