-1

expandListAdpater によって入力された Textviews の ArrayList があります。私の目標は、textViews の値を変更することですが、何らかの理由で一度しか機能しません。さまざまなタイマーを試し、ハンドラーを UI スレッドに関連付けようとしましたが、機能しません。これが私のコードです。助けてください!リストアダプターを展開…</p>

TextView mytexts= ButterKnife.findById(view, R.id.mytexts);
mySubSections.add(new ConstructForKeepingTextviewsForUpdate(mytexts));
// I got about 10 more textviews , this is an example

public class ConstructForKeepingTextviewsForUpdate {
    private TextView getTextviewToBeUpdated() {
        return textviewToBeUpdated;
    }

    public void SetVal(String t){
        getTextviewToBeUpdated().setText(t);
    }


    TextView textviewToBeUpdated;

    public ConstructForKeepingTextviewsForUpdate(TextView textviewToBeUpdated) {
        this.textviewToBeUpdated = textviewToBeUpdated;
        }

}

in onCreate I run this

private void pleaseWork(){
    new Timer().schedule(new TimerTask() {

        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                public void run() {
                    updateNumbersInLoop();
                }
            });
        }
    }, 0, 1000);
}

public static void updateNumbersInLoop() {
    for (ConstructForKeepingTextviewsForUpdate subSec : mySubSections){
       String datext = dbHelper.getValue (computedValue);
       subSec.SetVal(datext); 
    }
}
//The getValue function works , I can see the correct value, but the settext works only once, at the first time.
4

2 に答える 2

0

私はよく似たような問題を抱えていました。あらゆる方法を試しました。現在、この状況を回避するために AsynTasc を使用しています。onProgressUpdate() というメソッドがあります。UI スレッドで実行され、このメソッド内で TextView を更新できます。計算自体 (ループなど) は doInBackground() メソッドで処理できます。このメソッドは独自のスレッドで実行されています。yor TextView を更新するときは常に、 doInBackground() メソッド内で publishProgress("YourText") を呼び出します。次に、パラメーターが onProgressUpdate() に渡され、そこで TextView が更新されます。

    private class MultiplayerIntro extends AsyncTask<Void, String, Void> {

    @Override
    protected Void doInBackground(Void... result) {
        try{
        String text;
        for(...){
            text = ...;
            publishProgress(text);
            Thread.sleep(2000);
        }
    } catch (InterruptedException e) {
        // ...
    ]
        return null;
    }

    @Override
    protected void onProgressUpdate(String... progress) {
         yourTextView.setText(progress[0]);
    }

    @Override
    protected void onPostExecute(Void result) {
         // ...
    }
}

次に、タスクを次のように開始します。

new MultiplayerIntro().execute();

ここで多くのパラメーターの適切な説明を見つけることができます: Stackoverflow

于 2016-01-10T23:41:53.453 に答える
0

コードをいじってみたところ、asyncTask で同じ結果が得られました。どうやら、何らかの理由で textview をオブジェクトとして渡すことはできません。実際に機能するのは

TextView myTextV=  (TextView) findViewById(ConstructForKeepingTextviewsForUpdate.getItsID());
myTextV.setText("anything you like");

あなたがすべきことは、IDを整数として渡すことです。

于 2016-01-11T19:55:35.557 に答える