Use progress Dialog in footer
Asked Answered
G

3

6

I am making an app in which I have to add progress dialog in footer View but I am unable to get any progress dialog in footer view:

Main Activity:

I want to add progress dialog in footer in this class

public class MainActivity extends Activity implements OnScrollListener {

// All variables
XmlParser parser;
Document doc;
String xml;
ListView lv;
ListViewAdapter adapter;
ArrayList<HashMap<String, String>> menuItems;
ProgressDialog pDialog;

private String URL = "http://api.androidhive.info/list_paging/?page=1";

// XML node keys
static final String KEY_ITEM = "item"; // parent node
static final String KEY_ID = "id";
static final String KEY_NAME = "name";
ProgressDialog dialog;
// Flag for current page
int current_page = 1;

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

    lv = (ListView) findViewById(R.id.list);

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

    parser = new XmlParser();
    xml = parser.getXmlFromUrl(URL); // getting XML
    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)); // id not using any where
        map.put(KEY_NAME, parser.getValue(e, KEY_NAME));

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

    // LoadMore button
     dialog=new ProgressDialog(this);
   // Button btnLoadMore = new Button(this);
    //btnLoadMore.setText("Load More");

    // Adding Load More button to lisview at bottom
   // lv.addFooterView(dialog); 
// I want to use Progress Dialog in footer
   /* lv.addFooterView(dialog);*/

    // Getting adapter
    adapter = new ListViewAdapter(this, menuItems);
    lv.setAdapter(adapter);
    lv.setOnScrollListener(this);
     lv.addFooterView(dialog.getListView());

    /**
     * Listening to Load More button click event
     * */
    if(dialog.isShowing())
    {

    }
   /* btnLoadMore.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            // Starting a new async task
            new loadMoreListView().execute();
        }
    });*/

    /**
     * Listening to listview single row selected
     * **/
    lv.setOnItemClickListener(new OnItemClickListener() {


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

            // Starting new intent
            Intent in = new Intent(getApplicationContext(),
                    Test123.class);
            in.putExtra(KEY_NAME, name);
            startActivity(in);
        }
    });
}

/**
 * Async Task that send a request to url
 * Gets new list view data
 * Appends to list view
 * */
private class loadMoreListView extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // Showing progress dialog before sending http request
        if(dialog.isShowing())
        {
        dialog.cancel();    
        }
        else
        {
        pDialog = new ProgressDialog(
                MainActivity.this);
        pDialog.setMessage("Please wait..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
        }
    }

    protected Void doInBackground(Void... unused) {
        runOnUiThread(new Runnable() {
            public void run() {
                // increment current page
                current_page += 1;

                // Next page request
                URL = "http://api.androidhive.info/list_paging/?page=" + current_page;

                xml = parser.getXmlFromUrl(URL); // getting XML
                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));

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

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

                // Appending new data to menuItems ArrayList
                adapter = new ListViewAdapter(
                        MainActivity.this,
                        menuItems);
                lv.setAdapter(adapter);
                // Setting new scroll position
                lv.setSelectionFromTop(currentPosition + 1, 0);

            }
        });

        return (null);
    }

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

public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub
    dialog.show();
    lv.setOnScrollListener(this);
     lv.addFooterView(dialog.getListView());
     new loadMoreListView().execute();
}

public void onScrollStateChanged(AbsListView arg0, int arg1) {
    // TODO Auto-generated method stub
     new loadMoreListView().execute();
}
}

Adapter:

public class ListViewAdapter extends BaseAdapter {

private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;

public ListViewAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public int getCount() {
    return data.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.list_item, null);

    TextView name = (TextView)vi.findViewById(R.id.name);

    HashMap<String, String> item = new HashMap<String, String>();
    item = data.get(position);

    //Setting all values in listview
    name.setText(item.get("name"));
    return vi;
}
}

XmlParser

public class XmlParser {

// constructor
public XmlParser() {

}


public String getXmlFromUrl(String url) {
    String xml = null;

    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        xml = EntityUtils.toString(httpEntity);

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // return XML
    return xml;
}

/**
 * Getting XML DOM element
 * @param XML string
 * */
public Document getDomElement(String xml){
    Document doc = null;
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {

        DocumentBuilder db = dbf.newDocumentBuilder();

        InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml));
            doc = db.parse(is); 

        } catch (ParserConfigurationException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (IOException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }

        return doc;
}

/** Getting node value
  * @param elem element
  */
 public final String getElementValue( Node elem ) {
     Node child;
     if( elem != null){
         if (elem.hasChildNodes()){
             for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                 if( child.getNodeType() == Node.TEXT_NODE  ){
                     return child.getNodeValue();
                 }
             }
         }
     }
     return "";
 }

 /**
  * Getting node value
  * @param Element node
  * @param key string
  * */
 public String getValue(Element item, String str) {
        NodeList n = item.getElementsByTagName(str);
        return this.getElementValue(n.item(0));
    }
}

Any help will be appreciated.

Gyronny answered 27/8, 2012 at 9:47 Comment(0)
S
12

I think, You want a ProgressBar and not ProgressDialog

Add a new layout pb_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleSmall"
        android:indeterminate="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>

In code add

view = getLayoutInflater().inflate(R.layout.pb_layout, null);
TextView tv = (TextView)view.findViewById(R.id.textView1);
tv.setText("Please wait..");
ProgressBar pb = (ProgressBar)view.findViewById(R.id.progressBar1);
pb.setIndeterminate(true);
lv.addFooterView(view);

You can only do addFooterView before you do setadapter.

Scurlock answered 1/9, 2012 at 6:37 Comment(0)
J
1

You can Try this:

ProgressDialog myDialog = ProgressDialog.show(MyActivity.this, "Display Information","atthe bottom...", true);
myDialog.getWindow().setGravity(Gravity.BOTTOM);
Jagged answered 27/8, 2012 at 9:55 Comment(1)
i want to display the progress dialog on scroll onlyGyronny
Z
1

You can write a simple/enhanced custom control with special actions and behaviors. For example a complete menu system on this thread https://mcmap.net/q/1450012/-remove-line-between-custom-option-menu-items

An enhanced layout is very simpler than the menu in above link. Some points to make a progressDialog like window:

  • Use FrameLayout as root view
  • Design it in an XML Layout file
  • Inflate it in a subclass of FrameLayout ( in Constructor )
  • Provide some method like show() , hide(), stop() or everything else you need and implements those actions
  • Pass a layout to the custom control to use as it's parent like

    public void addTo(ViewGroup viewgroup){
        viewgroup.addView(this);
    }
    

and more...

If you need more information let me know.

Zealotry answered 1/9, 2012 at 5:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.