根据用户输入,我正在动态地将许多文本视图添加到循环中的相对布局中。
问题在于,随着电视数量的增加,构建布局所需的时间也增加到用户获得“等待/强制关闭”消息的时间点。
我知道这是因为它位于主UI线程上,但据我所知,我不能异步地向布局添加视图,比如在doInBackground中,因为“只有创建视图层次结构的原始线程才能触及其视图”错误。
每个新电视都是在前一个电视的右边或下面,在循环中计算,所以我无法将addview语句移动到AsyncTask onPostExecute。
有没有办法在使用AsyncTask时将for循环中的tv添加到布局?
这就是它需要做的事情:
public class LoadData extends AsyncTask<Void, Void, Void> {
protected void onPreExecute(){ ....
protected Void doInBackground(Void... params){ ...
while (yCoord + CellSizeH < b2.getHeight()) {
while (xCoord + CellSizeW < b2.getWidth() ) {
tv = new TextView(this);
tv.setTextSize(DisplayCellSizeH * 0.5f);
tv.setWidth(DisplayCellSizeW);
tv.setHeight(DisplayCellSizeH);
tv.setOnClickListener(new View.OnClickListener() {...
}
//this will error so needs to be in onPostExecute
thelayout.addView(tv, params1);
}
}
protected void onPostExecute(Void result){ ...
希望这是有道理的。感谢
答案 0 :(得分:3)
这是ListViews的用途。放入自定义适配器将起作用。从本质上讲,表中的每一行只会加载使其工作所需的内容。
基本上,ListView是您的容器,您可以创建一个适当填充数据的适配器。您将自定义适配器添加到ListView,然后进行设置。这是一个简单的适配器布局。
public class CustomAdapter extends BaseAdapter {
public CustomAdapter (Context c) {
}
public int getCount() {
/Number of rows
}
public Object getItem(int position) {
//Probably not required for your applications
}
public long getItemId(int position) {
//Probably not required for your applications
}
public View getView(int position, View convertView, ViewGroup parent) {
//Create a view here, and return it.
}
}
答案 1 :(得分:2)
将此添加到AsyncTask doinbaground允许在异步任务循环期间添加视图
Viewchart.this.runOnUiThread(new Runnable() {
public void run() {
thelayout.addView(tv, params1);
}
});
答案 2 :(得分:1)
这个代码来自某个项目中的一个实现,试试吧
声明你的布局和你在其上工作的活动
LinearLayout asyncLayout;
Activity myactivity;
并在onCreate
asyncLayout = (LinearLayout) findViewById(R.id.asyncLayout);
myactivity= this;
new LoadData().execute();
然后是你的异步实现
public class LoadData extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
}
protected Void doInBackground(Void... params) {
myactivity.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 3; i++) {
TextView text = new TextView(List_Activity.this);
text.setWidth(40);
text.setHeight(20);
text.setText("text : " + i);
asyncLayout.addView(text);
}
}
});
return null;
}
protected void onPostExecute(Void result) {
}
喂我回来