2011-02-02 10 views
6

Android 개발에 처음 접했습니다. 누군가가 관련 API를 알려 동적으로 TextView (또는 전체 화면)을 업데이트 할 수 있습니까?Android에서 TextView를 동적으로 업데이트합니다.

예 : 검색 응용 프로그램이있어서 모든 결과를 기다린 다음 결과가 표시 될 때까지 결과를 표시해야합니다.

+0

주 응용 프로그램 실행을 차단하는 검색을 원하지 않는 경우 별도의 스레드에서 검색을 수행해야합니다. 그런 다음 주기적으로 새 TextView 객체로 컨테이너를 업데이트하십시오. 따라서 비어있는 선형 레이아웃을 가질 수 있으며 주기적으로 검색 스레드를 호출하여 결과가 무엇인지 확인하고 선형 레이아웃에 추가 할 수 있습니다. – DeliveryNinja

+0

질문에 여전히 답이 있습니까? – winklerrr

답변

1

TextView으로 설정할 새 텍스트가있는 경우 textView.setText(newText)으로 전화하십시오. 여기서 newText는 업데이트 된 텍스트입니다. newText가 변경 될 때마다이 메서드를 호출합니다. 그것은 당신이 찾고있는 것입니까?

+0

고마워요 음 ... 어느 정도 대답은 ...하지만 새로 오는 데이터 외에 이전 데이터도 유지해야합니다 ... 어떻게해야합니까 ... 목록보기를 사용해야합니까 ... – prash

+0

@ 오래된 데이터를 추적하기 위해서'textView.getText()'를 사용할 수 있습니다. 첫 번째 : CharSequence old = textView.getText(); concat 이전 데이터와 새 데이터를 다시 TextView로 설정하십시오. textView.setText (old + ""+ new); – winklerrr

20

몇 가지 단계가 있지만 아는 정도와 그렇지 않은 정도는 언급하지 않았습니다.

가정 당신의 UI 초기 구조는 고해상도/레이아웃에 정의 당신의 활동에, 어딘가 텍스트 뷰가 포함되어 있으므로,

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

반환 값은 중복되지만 감사합니다! – 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에 당신을 수 있습니다 의미 스레드 안전 그 UI를 업데이트해야합니다. 보시다시피, refreshThread는 검색 콜렉션을 업데이트하고 (메소드가 동기화되었는지 확인한 후) 나중에 메인 (UI) 스레드에 통지하여 목록을 업데이트합니다.

것은 당신은 아마이 나를 위해 속임수를 썼는지이 당신이 listIndex과의 selectedItem을 초기화하거나 그들을 밖으로 던져 필요로 너무

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

몇 가지 미해결 부분 등이있을 수 있습니다 유용하지만, 일반적으로 발견 할 것이다 매우 비슷한 상황

이 도움이 :) 당신은 다른 스레드 내부에있는 경우

0

, 당신은 UI 스레드 내부의 텍스트 뷰를 업데이트해야합니다 희망 (나는 새로운 항목이 시간이 지남에 따라 목록을 채 웁니다 백그라운드 스레드가) .

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

} 
관련 문제