如何从AsyncTask添加视图到布局

时间:2014-02-15 13:37:51

标签: android android-layout android-asynctask

根据用户输入,我正在动态地将许多文本视图添加到循环中的相对布局中。

问题在于,随着电视数量的增加,构建布局所需的时间也增加到用户获得“等待/强制关闭”消息的时间点。

我知道这是因为它位于主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){ ...

希望这是有道理的。感谢

3 个答案:

答案 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) {
    }

喂我回来