Blackberry ListField: поддержка фокусировки строк во время обновления

После использования приведенного ниже кода обновите ListField, содержащий данные, возвращенные в веб-службе xml. Но после обновления или обновления он устанавливает фокус на первую строку в ListField. Я не хочу этого. Я хочу, чтобы он сохранял свою текущую ориентацию после обновления, чтобы пользователь даже не знал, что произошло обновление.

protected void onUiEngineAttached(boolean attached) {

    if (attached) {

       //TODO: you might want to show some sort of animated

       // progress UI here, so the user knows you are fetching data

        Timer timer = new Timer();

       //schedule the web service task to run every minute

        timer.schedule(new WebServiceTask(), 0, 60*1000);

    }

}

public MyScreen() {

    setTitle("yQAforum");

    listUsers.setEmptyString("No Users found", 0);

    listUsers.setCallback(this);

    add(listUsers);

}


private class WebServiceTask extends TimerTask {

    public void run() {

        //Fetch the xml from the web service

        String wsReturnString = GlobalV.Fetch_Webservice("myDs");

        //Parse returned xml

        SAXParserImpl saxparser = new SAXParserImpl();

        ByteArrayInputStream stream = new ByteArrayInputStream(wsReturnString.getBytes());

        try {


           saxparser.parse( stream, handler );

        } 

        catch ( Exception e ) {

           response.setText( "Unable to parse response.");

        }

       //now, update the UI back on the UI thread:

        UiApplication.getUiApplication().invokeLater(new Runnable() {

           public void run() {

              //Return vector sze from the handler class

              listUsers.setSize(handler.getItem().size());

             //Note: if you don't see the list content update, you might need to call

             //  listUsers.invalidate();

             //here to force a refresh.  I can't remember if calling setSize() is enough.

           }

        });

    }

}
0
добавлено отредактировано
Просмотры: 1
de
Получить текущую выбранную строку перед обновлением данных и использовать этот индекс позже. Проверьте документацию, blackberry.com/developers/docs/4.3.0api/net/rim/device/api/u‌ я/& hellip; . Используйте getSelectedIndex() и setSelectedIndex (индекс int) .
добавлено автор Rupak, источник
В какой момент кода я должен это реализовать? Потому что я пробовал это, и это не сработало. listUsers.getSelectedIndex (); listUsers.setSize (. handler.getItem() размер ()); listUsers.setSelectedIndex (listUsers.getSelectedIndex ());
добавлено автор promise Ihemegbulam, источник

1 ответы

Поскольку я предложил в комментариях после моего вчерашнего ответа , вам нужно записать текущую сфокусированную строку, прежде чем обновлять список, и затем снова установите сфокусированную строку сразу после обновления.

Так, например, в WebServiceTask :

    UiApplication.getUiApplication().invokeLater(new Runnable() {
       public void run() {
          int currentIndex = listUsers.getSelectedIndex();
          int scrollPosition = getMainManager().getVerticalScroll();

          //Return vector sze from the handler class
          listUsers.setSize(handler.getItem().size());

          listUsers.setSelectedIndex(currentIndex);
          getMainManager().setVerticalScroll(scrollPosition);
       }
    });

В коде, который вы отправили в своем комментарии, вы вызывали setSelectedIndex() с результатом getSelectedIndex() после , который вы обновили, что никогда не будет делать то, что вы хотите.

1
добавлено
Я не вижу, как определяется ваш класс MyScreen , но я предполагаю, что это MainScreen или что-то в этом роде. Поэтому он будет содержать главный менеджер , который обычно является VerticalFieldManager . Этот главный менеджер контролирует свиток. Таким образом, точно так же, как вы записываете и обновляете текущий выбранный индекс списка, вам необходимо записать и сбросить текущую позицию вертикальной прокрутки. См. Мое обновление для ответа выше. Кроме того, запомните accept и/или upvote ответы, которые помогут вам. Благодарю.
добавлено автор Nate, источник
Если это так, то вы делаете что-то неправильно в коде, который вы нам не показали (в этом вопросе или в последнем). Возможно, в ваших реализациях ListFieldCallback . Пожалуйста, задайте новый вопрос об этой проблеме с полным кодом вашего класса ListFieldCallback (который, я думаю, является вашим классом MyScreen ). Это также может быть проблемой с вашим ResponseHandler , который я также не вижу. Возможно, вам нужно очистить обработчик или создать новый экземпляр обработчика во время каждого обновления.
добавлено автор Nate, источник
Ну, как я сказал в своем ответе на ваш последний вопрос, есть и другие вещи, о которых стоит подумать. Вам нужно добавить код для устранения сбоев сети. Вы должны защитить WebServiceTask , чтобы он не пытался обновить, если обновление с 1 минуты назад все еще продолжается. Я понятия не имею, что делает ваше приложение, но для множества приложений пользователям не нравится, когда их телефон автоматически делает сетевые звонки каждую минуту. Это приводит к утечке аккумулятора. Было бы лучше, если бы сетевые вызовы были сделаны только в случае необходимости. Но я не могу сделать эту рекомендацию, не понимая приложения лучше.
добавлено автор Nate, источник
Ваши читатели действительно нуждаются в новостях, обновляемых каждую минуту? Может быть, и так, я не знаю. Имеет ли смысл иметь кнопку, которая позволяет им переключаться между режимами, когда приложение автоматически обновляется каждые 30/60/90 секунд или вообще не обновляется? Возможно, есть кнопка обновления вручную, как вы видите в URL-адресе браузера? Во всяком случае, это действительно открытый вопрос и требует полного понимания приложения. У меня недостаточно информации, чтобы принять это решение за вас. Попробуйте разбить проблему на небольшие куски и задавать несколько узких вопросов.
добавлено автор Nate, источник
Кроме того, в зависимости от того, какая у вас инфраструктура сервера (если есть), вы можете захотеть просмотреть push-уведомления, когда будет доступен новый контент. Но это еще одна возможность. Для меня (или кого-либо еще) невозможно понять, что подходит вам, о том, что вы нам сказали до сих пор.
добавлено автор Nate, источник
Пожалуйста. Опять же, попробуйте разбить проблему на мельчайшие части, которые вы можете. Переполнение стека действительно предназначено для узких вопросов программирования. Если у вас есть общий вопрос о том, как пользовательский интерфейс будет работать лучше всего, вы можете попробовать опубликовать его на сайте Пользовательский опыт . Или же общий вопрос программирования, который задает вопрос о наилучшем алгоритме обновления мобильного приложения типа новостей, может быть опубликован на Программисты . Удачи!
добавлено автор Nate, источник
Я не знаю. Я не работаю для RIM. Я на 100% уверен, однако, что RIM не записывал список, чтобы каждое устройство BlackBerry опросило сервер один раз в минуту, проверяя наличие обновлений для контактов каждого человека.
добавлено автор Nate, источник
Дорогой Нейт, я создал его.
добавлено автор promise Ihemegbulam, источник
Привет, мистер Нейт. Я только что заметил что-то в поле «Список». Данные в дубликате поля списка после первого обновления!
добавлено автор promise Ihemegbulam, источник
Спасибо Нейту. Я очень ценю все. Я передумаю и найду еще один вариант.
добавлено автор promise Ihemegbulam, источник
Дорогой Нейт. Как работает функция списка контактов bbm? Разве вы не думаете, что они реализовали Список так же, как я хочу, чтобы моя работала. Потому что я заметил, что список автоматически обновляется.
добавлено автор promise Ihemegbulam, источник
Приложение работает как приложение для подачи новостей. Это означает, что список должен быть обновлен текущими новостями. Мне действительно нужна ваша рекомендация. Спасибо.
добавлено автор promise Ihemegbulam, источник
Нейт, спасибо. Но как вы думаете, этот метод является наилучшей практикой для реализации автоматического обновления в поле «Список», чтобы обновить его данными, возвращаемыми в веб-службе?
добавлено автор promise Ihemegbulam, источник
Нейт, спасибо, что сработало! Я так благодарен. Но у меня все еще проблема с сохранением положения прокрутки. Как мне это сделать?
добавлено автор promise Ihemegbulam, источник