Проблема с макетом Android и progressbar

#android #rss #progress-bar

#Android #RSS-канал #индикатор выполнения

Вопрос:

Я все еще работаю над своим приложением, которое должно хранить данные RSS локально. Пока что мне удалось создать локальную базу данных и проанализировать онлайн-RSS-канал. Мне также удалось поместить эту информацию в базу данных, так что теперь приложение также будет доступно в автономном режиме.

Однако я не могу понять, как сделать следующее: у меня есть 2 кнопки, одна из них считывает заголовки базы данных и переходит на подробную страницу вашего выбора (все еще работаю над этим)

Моя текущая проблема заключается в том, что я не могу добавить панель загрузки, которая будет появляться на экране, пока приложение загружает данные из Интернета. Экран остается пустым примерно на 10 секунд, а затем появляется список. вот код, который я использую:

общедоступный класс SynchDB_Activity расширяет ListActivity {

 public List<Message> messages;
public List<String> titles;
//ProgressDialog dialog = ProgressDialog.show(SynchDB_Activity.this, "", "Downloading data...", true);

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.animal_list_view);

    loadFeed();
}

private void loadFeed(){

    try{
        BaseFeedParser parser = new BaseFeedParser();
        messages = parser.parse();

        List<String> titles = new ArrayList<String>(messages.size());

        DBAdapter db = new DBAdapter(this);

        for (Message msg : messages){
            titles.add(msg.getTitle());
            db.addRow(  
                msg.getTitle(), 
                msg.getDescription(), 
                "bla", 
                "http:/", 
                msg.getLink());
        }

        //dialog.dismiss();

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.row,titles);
        this.setListAdapter(adapter);

    } catch (Throwable t){
        Log.e("AndroidNews",t.getMessage(),t);
    }
}
  

Итак, этот код работает и помещает все данные в локальную базу данных. Однако я просто не могу заставить эту панель загрузки работать, и это сводит меня с ума.

Если бы кто-нибудь мог мне помочь, я был бы благодарен!!! Я весь день гуглил, и, похоже, ничего не помогает….

большое спасибо

редактировать: Как вы можете видеть в коде, я отображаю список, когда все готово. Это необязательно, но с того момента, как я удаляю ArrayAdapter, приложение больше не будет работать.

Имейте в виду, что все это для меня совершенно ново, и я думаю, что основная часть, где что-то идет не так, — это использование разных макетов…

Ответ №1:

Используйте асинхронную задачу и индикатор выполнения, как показано здесь:

 public void  getrss()
{
     try{
        class test extends AsyncTask{


             TextView tv_per;
             int mprogress;

            Dialog UpdateDialog = new Dialog(ClassContext);

            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                mprogress = 0;

                UpdateDialog.setTitle(getResources().getString(R.string.app_name));
                UpdateDialog.setContentView(R.layout.horizontalprogressdialog);
                TextView dialog_message =  (TextView)UpdateDialog.findViewById(R.id.titleTvLeft);
                tv_per = (TextView)UpdateDialog.findViewById(R.id.hpd_tv_percentage);
                dialog_message.setText(getResources().getString(R.string.dialog_retrieving_data));
                dialog_message.setGravity(Gravity.RIGHT);
                UpdateDialog.setCancelable(false);
                UpdateDialog.show();
                super.onPreExecute();
            }



            @Override
            protected void onProgressUpdate(Object... values) {
                // TODO Auto-generated method stub
                ProgressBar update = (ProgressBar)UpdateDialog.findViewById(R.id.horizontalProgressBar);
                update.setProgress((Integer) values[0]);
                int percent =  (Integer) values[0];
                if(percent>=100)
                {
                    percent=100;
                }
                tv_per = (TextView)UpdateDialog.findViewById(R.id.hpd_tv_percentage);
                 tv_per.setText("" percent);
            }



            @Override
            protected Object doInBackground(Object... params) {
                // TODO Auto-generated method stub
                //your code
}

                super.onPostExecute(result);
                UpdateDialog.dismiss();
            }

         }
         new test().execute(null);

     }
     catch(Exception e)
     {
         e.printStackTrace();
     }

}
  

Комментарии:

1. Спасибо за ответ, однако я не уверен, как реализовать код, который вы мне дали, Как должно выглядеть представление, чтобы это работало? Также я получаю ошибку в «ClassContext» и некоторые ошибки о правильном использовании токенов «{«»}» Есть ли шанс, что вы могли бы опубликовать проект intire? это облегчило бы мне понимание того, что я делаю неправильно. Спасибо

2. Можете ли вы выделить строки, в которых вы получаете ошибки? и вам нужен файл макета updatedialog?

3. Эй, я попробовал несколько версий вашего кода и в конечном итоге разобрался, большое спасибо за быстрый ответ, приятель!

Ответ №2:

Вы, вероятно, хотите использовать AsyncTask.