2011-02-02 3 views
6

Я довольно новичок в разработке Android. Может ли кто-нибудь сообщить мне соответствующие API-интерфейсы для динамического обновления TextView (или всего экрана)?динамически обновлять TextView в Android

Например: У меня есть приложение для поиска, и мне нужно показать результаты по мере их поиска, а не ждать всех результатов, а затем показать.

+0

Вам нужно будет выполнить поиск в отдельной ветке, скорее всего, если вы не хотите, чтобы поиск блокировал выполнение вашего основного приложения. Затем попросите его периодически обновлять контейнер новыми объектами TextView. Таким образом, у вас может быть линейный макет, пустой и периодически вызывающий поток поиска, чтобы увидеть, какие результаты он имеет, и добавить их в линейный макет. – DeliveryNinja

+0

Ваш вопрос до сих пор остается без ответа? – winklerrr

ответ

1

Если у вас есть новый текст для установки на TextView, просто позвоните textView.setText(newText), где newText - это обновленный текст. Вызовите этот метод всякий раз, когда newText изменился. Это то, что вы ищете?

+0

спасибо хмм ... что ответы в некоторой степени ... но мне нужно сохранить старые данные также в дополнение к новым данным ... как я это сделаю .. должен ли я использовать просмотр списка ... – prash

+0

@ prash для отслеживания старых данных, вы можете использовать 'textView.getText()'. Сначала: 'CharSequence old = textView.getText();', затем, например. concat старые и новые данные и верните его в «TextView»: 'textView.setText (old +" "+ new);' – winklerrr

20

Есть несколько шагов, и вы не указали, насколько вы знаете, насколько вы этого не делаете.

Предполагая, что ваш UI исходная структура определяется в Рез/макете и включает в себя TextView где-то в вашей деятельности:

public void updateTextView(String toThis) { 
    TextView textView = (TextView) findViewById(R.id.textView); 
    textView.setText(toThis); 
} 
+3

return избыточен, но спасибо! – Austin

0

Во-первых, вам необходимо представление списка, так

private volatile ArrayList<String>  searchResults; 
ListView searchList = (ListView) findViewById(R.id.listYOURLISTVIEW); 
listAdapter = new ArrayAdapter<String>(this, R.layout.blacklist, R.id.list_content, searchResults); //blacklist is a layout to paint the fonts black 
searchList.setAdapter(listAdapter); 

Вот что может помочь.

private Thread refreshThread; 
private boolean isRefreshing = false; 

private void reinitializeRefreshThread() 
{ 
    if (!refreshThread.equals(null)) refreshThread.stop(); 
    Log.d(LOGTAG+"::reinitializeRefreshThread()", "Creating new thread!\n"); 
    isRefreshing = true; 
    refreshThread = (new Thread(new Runnable() 
    { 
     public void run() 
     { 
      Looper.prepare(); 
      while (isRefreshing) 
      { 
       //GRAB YOUR SEARCH RESULTS HERE 
       //make sure the methods are synchronized 
       //maybe like 
       String[] results = grabResults(); //doesn't need to be synchronized 
       addResultList(results); 

       Message message = myHandler.obtainMessage(); 
       myHandler.sendMessage(message); 
       try 
       { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 
       Log.d(LOGTAG+"->refreshThread", "Refresh finished!\n"); 
      } 
     } 
    })); 
    Log.d(LOGTAG+"::reinitializeRefreshThread()", "Refresh thread started!\n"); 
    refreshThread.start(); 
} 

final Handler myHandler = new Handler() 
{ 
    public void handleMessage(android.os.Message msg) 
    { 
     listAdapter.notifyDataSetChanged(); 
    }; 
}; 

где

public synchronized void addResultList(String[] results) 
{ 
    // remove the whole list, repopulate with new data 
    searchResults.clear(); 
    for (int i = 0; i < results.length; i++) 
    { 
     addResult(results[i]); 
    } 
} 

private synchronized void addResult(CharSequence result) 
{ 
    if (!searchResults.contains(result.toString())) 
     searchResults.add(result.toString()); 
    else 
     Toast.makeText(getApplicationContext(), "Result " + result.toString() + " was already on the list!", Toast.LENGTH_SHORT).show(); 
} 

Все это потокобезопасно, а это означает, что позволит вам «изменение» GUI от других, чем основной поток нитей, отправив сообщение в основной поток, что Пользовательский интерфейс нуждается в обновлении. Как вы можете видеть, refreshThread обновляет коллекцию поиска (убедитесь, что метод синхронизирован), а затем уведомляет об этом основной поток (UI) для обновления списка.

Вы, вероятно, найти это полезным слишком

searchList.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
     { 
      listIndex = arg2; 
      selectedItem = (String) searchList.getItemAtPosition(listIndex); 
      Toast.makeText(getApplicationContext(), "Result[" + listIndex + "] " + selectedItem + " selected!", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

Там может быть несколько свободных концов, такие, как вам необходимо инициализировать ListIndex и SelectedItem или просто выбросить ет, но в целом это сделал трюк для меня очень похожая ситуация (у меня есть фоновый поток, заполняющий список по времени с новыми записями)

Надеется, что это помогает :)

0

Если вы находитесь внутри другого потока, убедитесь, что вы обновить TextView внутри потока пользовательского интерфейса ,

private void updateTextView(final String s) { 
    MainActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      TextView tv= (TextView) findViewById(R.id.tv); 
      tv.setText("Text = "+s); 
     } 
    }); 

} 
Смежные вопросы