web-dev-qa-db-ja.com

Android)でTextViewを動的に更新します

私はAndroid開発にまったく慣れていません。誰かがTextView(または画面全体)を動的に更新するための関連APIを教えてもらえますか?

例:検索アプリケーションがあり、すべての結果を待ってから表示するのではなく、見つかった結果を表示する必要があります。

9
prash

いくつかのステップがあり、あなたはあなたがどれだけ知っているか、どれだけ知らないかについて言及しませんでした。

UIの初期構造がres/layoutで定義されており、アクティビティのどこかにTextViewが含まれていると仮定します。

public void updateTextView(String toThis) {
    TextView textView = (TextView) findViewById(R.id.textView);
    textView.setText(toThis);
}
23
Frank C.

TextView に設定する新しいテキストがある場合は、 textView.setText(newText) を呼び出すだけです。ここで、newTextは更新されたテキストです。 newTextが変更されたときはいつでも、このメソッドを呼び出します。それはあなたが探しているものですか?

3
AndyAndroid

まず、リストビューが必要なので、

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

これはすべてスレッドセーフです。つまり、UIの更新が必要なメッセージをメインスレッドに送信することで、メインスレッド以外のスレッドから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を初期化する必要がある、または単にemを破棄する必要があるなど、いくつかのルーズエンドがあるかもしれませんが、一般的に、これは非常によく似た状況で私にとってトリックを行いました(私は時間の経過とともに新しいものをリストに追加するバックグラウンドスレッドを持っていますエントリー)

それが役に立てば幸い :)

2
Shark

これを試してください

TextView textView = (TextView)findViewById(R.id.textViewID);
textView.setText("The test you need");
view.invalidate();  // for refreshment
1
Roushdy

別のスレッド内にいる場合は、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);
        }
    });

}
1
Sandeep