2013-03-14 4 views
0

Проблема заключается в том, что счетчик прогресса загружается только после завершения вызова api. Я предполагаю, что причина имеет смысл только после этого, я возвращаю представление. Не уверен, как добавить это в Диалог до и во время вызова api?Загрузка контрольной панели перед загрузкой списка в пользовательском DialogPreference

protected View onCreateDialogView() { 

    subscriptions = null; 
    LayoutInflater inflater = ((SettingsActivity) ctx).getLayoutInflater(); 
    final View vw = inflater.inflate(R.layout.channel_content_view, null); 

    header = ((SettingsActivity) ctx).getLayoutInflater().inflate(R.layout.channels_header,null); 
    ((TextView) header.findViewById(R.id.channels_header)).setText("Channels"); 

    LinearLayout linlaHeaderProgress = (LinearLayout) vw.findViewById(R.id.channelsProgress); 
    linlaHeaderProgress.setVisibility(View.VISIBLE); 

//  Do this in a new Thread 

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

//  ((TextView) lv.findViewById(R.id.channel_desciption)).setText("CHANNELS"); 
    Thread thread = new Thread() 
    { 
     @Override 
     public void run() { 
//      get the all the channels from api on web 
        channels = Json.getJson(apiurl + "/rest/channel/"+ linkid +"/"+ username, "GET", null); 
     } 
    }; 

    thread.start(); 

    lv.addHeaderView(header); 

    return vw; 
} 

channel_content_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/channels_list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:clickable="true" 
    android:orientation="horizontal" > 
    <LinearLayout 
     android:id="@+id/channelsProgress" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:orientation="vertical" 
     android:visibility="gone" > 

     <ProgressBar 
      android:id="@+id/pbChannelsProgress" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" > 
     </ProgressBar> 
    </LinearLayout> 
    <ListView 
     android:id="@+id/list" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:descendantFocusability="blocksDescendants" > 
    </ListView> 

</LinearLayout> 

ответ

0

Не знаю, если это будет работать, но вы можете попытаться сначала создать диалог, а затем изменить содержание!

Это некрасиво и может быть легко переписать с AsyncTask, но я думаю, что он будет делать трюк:

protected View onCreateDialogView() { 

    subscriptions = null; 
    LayoutInflater inflater = ((SettingsActivity) ctx).getLayoutInflater(); 
    final View vw = inflater.inflate(R.layout.channel_content_view, null);  
    LinearLayout linlaHeaderProgress = (LinearLayout) vw.findViewById(R.id.channelsProgress); 
    linlaHeaderProgress.setVisibility(View.VISIBLE); 
    ((TextView) header.findViewById(R.id.channels_header)).setText("Channels"); 

    //  Do this in a new Thread 
    Thread thread = new Thread() 
    { 
     @Override 
     public void run() { 
//      get the all the channels from api on web 
        channels = Json.getJson(apiurl + "/rest/channel/"+ linkid +"/"+ username, "GET", null); 
        setListLayout(vw,linlaHeaderProgress); 
     } 
    }; 
    thread.start(); 



    return vw; 
} 


protected void setListLayout(View vw,View progressBar){ 


    runOnUiThread(new Runnable() { 
       public void run() { 
        Thread.sleep(500); // to avoid super fast results from the server and always display the loader bar for a while 
        header = ((SettingsActivity) ctx).getLayoutInflater().inflate(R.layout.channels_header,null);  
        final ListView lv = (ListView) vw.findViewById(R.id.list); 
        lv.addHeaderView(header); 
        progressBar.setVisibility(hidden); 
        lv.setVisibility(visible); 

       } 
      }); 

} 
0

У меня есть два предложения для вас:

  1. Это может быть, что Выполнение потока выполняется слишком быстро, и оно заканчивается раньше, чем отображается индикатор выполнения. Я бы держал Thread в спящем режиме, чтобы убедиться, что это так. (Это только для подтверждения того, что происходит, чтобы не использовать этот метод, это вызовет и дополнительную задержку)

    Например попытайтесь поместить это:

    Thread thread = new Thread() 
         { 
          @Override 
          public void run() { 
          try{ 
          Thread.sleep(3000); 
          } 
          catch(Exception e){} 
        //      get the all the channels from api on web 
             channels = Json.getJson(apiurl + "/rest/channel/"+ linkid +"/"+ username, "GET", null); 
          } 
         }; 
    
    1. Кроме того, если выше не работает попробуйте это ниже метод Shwoing прогресс бар и посмотреть, если он работает:

    Вызвать showProgressBar() метод, с которого вы будете создавать экземпляр диалогового окна или, если это невозможно, то пусконаладка OnC reateDialog Метод:

    void showProgressBar(Context ctx){ 
    
        progressBar = new ProgressDialog(ctx); //this is a context object probably ctx object will go here as 
        progressBar.setCancelable(false); 
        progressBar.setMessage("Heavy Process...."); 
        progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    
        progressBar.show(); 
        } 
    
    protected View onCreateDialogView() { 
    
        ///I think ctx is an Activity 
        showProgressBar(ctx); ///if it is not possible to call showProgressBar() from where you are instantiating the Dialog 
    
        subscriptions = null; 
        LayoutInflater inflater = ((SettingsActivity) ctx).getLayoutInflater(); 
        final View vw = inflater.inflate(R.layout.channel_content_view, null); 
    
        header = ((SettingsActivity) ctx).getLayoutInflater().inflate(R.layout.channels_header,null); 
        ((TextView) header.findViewById(R.id.channels_header)).setText("Channels"); 
    
        /* 
        Commented below lines of Progress Bar because we are displayin it above. 
        */ 
        //LinearLayout linlaHeaderProgress = (LinearLayout) vw.findViewById(R.id.channelsProgress); 
        ///linlaHeaderProgress.setVisibility(View.VISIBLE); 
    
    //     Do this in a new Thread 
    
        final ListView lv = (ListView) vw.findViewById(R.id.list); 
    
    //  ((TextView) lv.findViewById(R.id.channel_desciption)).setText("CHANNELS"); 
    
        Thread thread = new Thread() 
        { 
    
        @Override 
        public void run() { 
    
    //      get the all the channels from api on web 
    
          channels = Json.getJson(apiurl + "/rest/channel/"+ linkid +"/"+ username, "GET", null); 
    
        } 
    
        }; 
    
    
    
        thread.start(); 
    
        lv.addHeaderView(header); 
    
        return vw; 
    } 
    

Кроме того, если вы хотите, чтобы в ProgressBar возможность размещения в диалоговом окне, то вам придется создать Acivity и сделать, которые появляются в качестве диалога. К этому просто добавить

Ниже скопирован из Android страницы Документация (http://developer.android.com/guide/topics/ui/dialogs.html):

Совет: Если вы хотите пользовательский диалог, вы можете вместо этого отображать активность в качестве диалога вместо использования Dialog API, , Просто создать деятельность и установить его тему к Theme.Holo.Dialog в манифесте элемента:

Примечание Это очень просто большая часть кода в вашем onCreateDialogView является переносимым на активность OnCreate метод

+0

индикатор хода делает шоу, но его за циферблатом ogview. как я могу сделать это так? – Harry

+0

И я хочу показать панель загрузки внутри диалогового окна – Harry

+0

@Harry Это означает, что вам нужен пользовательский диалог. Затем вам нужно будет сделать Activity как диалог. Я обновлю свой ответ ... –

0
()

Это было на самом деле очень простой вопрос с моими раскладок

меняю расположение к: работает

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/channels_list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:clickable="true" 
    android:orientation="horizontal" > 
    <LinearLayout 
     android:id="@+id/channelsProgress" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:orientation="vertical" 
     android:visibility="gone" > 

     <ProgressBar 
      android:id="@+id/pbChannelsProgress" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:descendantFocusability="beforeDescendants" > 
     </ProgressBar> 
    </LinearLayout> 
    <ListView 
     android:id="@+id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:descendantFocusability="afterDescendants" > 
    </ListView> 

</LinearLayout>