首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从同步任务返回数组

从同步任务返回数组
EN

Stack Overflow用户
提问于 2018-02-03 18:43:04
回答 2查看 152关注 0票数 2

我正在尝试使用一个ArrayList填充一个列表视图,这个列表必须根据这里告诉https://stackoverflow.com/a/22326209/8520030的内容从Asynctask返回。我试图将压缩文件显示为列表视图,我使用的是异步任务,正常情况下,在listview中加载项目需要花费太多的时间。,但在使用Asynctask时列表视图中没有显示任何内容。就像它没有用listview项目填充一样。,我到目前为止已经这样做了。

代码语言:javascript
复制
public interface IAsyncTask {

    ArrayList<String> IAmFinished(ArrayList<File> arrayList);
}

public class MainActivity2 extends AppCompatActivity implements IAsyncTask {

public static ArrayList<File> fileList = new ArrayList<>();
public static ArrayList<String> name = new ArrayList<>();
Longoperation longoperation;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    File dir1 = new File(Environment.getExternalStorageDirectory().getPath());
    longoperation = new Longoperation(dir1, this);
    longoperation.execute();
    JazzyListView lv = (JazzyListView) findViewById(R.id.list);


    lv.setAdapter(new ArrayAdapter<>(this,
            android.R.layout.simple_list_item_1, name));
}

@Override
public ArrayList<String> IAmFinished(ArrayList<File> list) {
    for(int i=0;i< list.size();i++){
        name.add(list.get(i).getName());
    }
    return name;
}

private class Long operation extends AsyncTask<File, Void, ArrayList<File>>{

    File dir;
    private static final String TAG = "com.example.dell_1.myapp3.Zip";
    private IAsyncTask asyncTaskListener;

    public Longoperation(File dir,IAsyncTask asyncTaskListener) {
        this.dir = dir;
        this.asyncTaskListener = asyncTaskListener;
    }

    @Override
    protected ArrayList<File> doInBackground(File... params) {
        File listFile[] = dir.listFiles();
        if (listFile != null && listFile.length > 0) {
            for (int i = 0; i < listFile.length; i++) {

                if (listFile[i].isDirectory()) {
                    doInBackground(listFile[i]);

                } else {

                    boolean booleanpdf = false;
                    if (listFile[i].getName().endsWith(".zip") || listFile[i].getName().endsWith(".jar")) {

                        for (int j = 0; j < fileList.size(); j++) {
                            if (fileList.get(j).getName().equals(listFile[i].getName())) {
                                booleanpdf = true;
                            } else {

                            }
                        }

                        if (booleanpdf) {
                            booleanpdf = false;
                        } else {
                            fileList.add(listFile[i]);

                        }
                    }
                }
            }
        }
        return fileList;
    }

    public void onPostExecute(ArrayList<File> list) {
        asyncTaskListener.IAmFinished(list);
    }
}
}

但我无法填充列表视图。在列表视图. .中没有显示任何内容

我怎么才能解决这个问题?我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2018-02-04 06:38:25

从onCreate中删除以下行。

代码语言:javascript
复制
IAmFinished(fileList);

从onCreate中剪切以下行并粘贴到IamFinished后的for循环中。

代码语言:javascript
复制
lv.setAdapter(new ArrayAdapter<>(this,
        android.R.layout.simple_list_item_1, name));

别忘了在全球范围内装饰JazzyListView。

修改代码的结尾看起来是这样的。

代码语言:javascript
复制
    public interface IAsyncTask {

    ArrayList<String> IAmFinished(ArrayList<File> arrayList);
}

public class MainActivity2 extends AppCompatActivity implements IAsyncTask {


public static ArrayList<File> fileList = new ArrayList<>();
public static ArrayList<String> name = new ArrayList<>();
Longoperation longoperation;
JazzyListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    File dir1 = new File(Environment.getExternalStorageDirectory().getPath());
    longoperation = new Longoperation(dir1, this);
    longoperation.execute();
    lv = (JazzyListView) findViewById(R.id.list);



}

@Override
public ArrayList<String> IAmFinished(ArrayList<File> list) {
    for(int i=0;i< list.size();i++){
        name.add(list.get(i).getName());
    }

        lv.setAdapter(new ArrayAdapter<>(this,
            android.R.layout.simple_list_item_1, name));
    return name;
}

private class Longoperation extends AsyncTask<File, Void, ArrayList<File>>{

    File dir;
    private static final String TAG = "com.example.dell_1.myapp3.Zip";
    private IAsyncTask asyncTaskListener;

    public Longoperation(File dir,IAsyncTask asyncTaskListener) {
        this.dir = dir;
        this.asyncTaskListener = asyncTaskListener;
    }

    @Override
    protected ArrayList<File> doInBackground(File... params) {
        File listFile[] = dir.listFiles();
        if (listFile != null && listFile.length > 0) {
            for (int i = 0; i < listFile.length; i++) {

                if (listFile[i].isDirectory()) {
                    doInBackground(listFile[i]);

                } else {

                    boolean booleanpdf = false;
                    if (listFile[i].getName().endsWith(".zip") || listFile[i].getName().endsWith(".jar")) {

                        for (int j = 0; j < fileList.size(); j++) {
                            if (fileList.get(j).getName().equals(listFile[i].getName())) {
                                booleanpdf = true;
                            } else {

                            }
                        }

                        if (booleanpdf) {
                            booleanpdf = false;
                        } else {
                            fileList.add(listFile[i]);

                        }
                    }
                }
            }
        }
        return fileList;
    }

    public void onPostExecute(ArrayList<File> list) {
        asyncTaskListener.IAmFinished(list);
    }
}
}
票数 0
EN

Stack Overflow用户

发布于 2018-02-04 07:35:51

您需要通过调用notifyDataSetChanged()来刷新适配器。就像这样:

代码语言:javascript
复制
lv = (JazzyListView) findViewById(R.id.list);
..
lv.getAdapter().notifyDataSetChanged();

或者你可以用这样的东西:

代码语言:javascript
复制
// need to make the class scope variable.
ArrayAdapter mAdapter;

// create the adapter
mAdapter = new ArrayAdapter<>(this,
        android.R.layout.simple_list_item_1, name)
lv.setAdapter(adapter);

...
// refresh the adapter in your listener.
mAdapter.notifyDataSetChanged()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48600752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档