我有一个由expandListAdpater填充的Textviews的ArrayList,我的目标是更改textViews的值,但由于某种原因它只能运行一次。我尝试了不同的计时器,试图将我的处理程序绑定到ui线程,它永远不会工作。这是我的代码。请帮忙! Expandlistadapter ...
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.
答案 0 :(得分:0)
我经常遇到类似的问题。我尝试了各种不同的方式。现在我正在使用AsynTasc来避免这种情况。它有一个名为onProgressUpdate()的方法。它在UI线程上运行,在此方法中,您可以更新TextView。计算itselft(例如你的循环)可以在doInBackground()方法中处理。此方法在自己的Thread中运行。总是当你想要更新你的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
答案 1 :(得分:0)
当我玩代码时,asyncTask给出了相同的结果。显然,出于某种原因,您无法将textview作为对象传递。实际上有效的是
TextView myTextV= (TextView) findViewById(ConstructForKeepingTextviewsForUpdate.getItsID());
myTextV.setText("anything you like");
你应该做的是将id作为整数传递。