6

フッタービューに進行状況ダイアログを追加する必要があるアプリを作成していますが、フッタービューに進行状況ダイアログを表示できません。

主な活動:

このクラスのフッターに進行状況ダイアログを追加したい

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

アダプタ:

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

どんな助けでもありがたいです。

4

3 に答える 3

12

ProgressDialogではなく、 ProgressBarが必要だと思います

新しいレイアウト 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>

コードで追加

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

setadapter を実行する前に、addFooterView のみを実行できます。

于 2012-09-01T06:37:01.160 に答える
1

これを試すことができます:

ProgressDialog myDialog = ProgressDialog.show(MyActivity.this, "Display Information","atthe bottom...", true);
myDialog.getWindow().setGravity(Gravity.BOTTOM);
于 2012-08-27T09:55:07.373 に答える
1

特別なアクションと動作を備えたシンプル/拡張カスタム コントロールを作成できます。たとえば、このスレッドの完全なメニュー システム https://stackoverflow.com/a/11805044/1290995

強化されたレイアウトは、上記のリンクのメニューよりも非常にシンプルです。progressDialog のようなウィンドウを作成するためのいくつかのポイント:

  • FrameLayout をルート ビューとして使用する
  • XML レイアウト ファイルで設計する
  • FrameLayout のサブクラスで( Constructor で)膨らませます
  • show()hide()stop()または必要な他のすべてのメソッドを提供し、それらのアクションを実装します
  • レイアウトをカスタム コントロールに渡して、親のように使用する

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

もっと...

さらに情報が必要な場合はお知らせください。

于 2012-09-01T05:05:23.553 に答える