[英]return arraylist from Asynctask
我正在尝试使用ArrayList填充listview,该列表必须从Asynctask返回,方法是根据此处所讲的https://stackoverflow.com/a/22326209/8520030 。 我试图将zip文件显示为listview。我正在使用asynctask,因为通常在列表视图中加载项目需要太多时间。 但是在使用Asynctask的列表视图中没有任何显示。 就像它没有填充listview项。 到目前为止,我已经做到了。
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);
}
}
}
但是我无法填充列表视图。 列表视图中未显示任何内容。
我怎样才能解决这个问题? 我究竟做错了什么?
从onCreate中删除以下行。
IAmFinished(fileList);
从onCreate剪切以下行,并在for循环后粘贴到IamFinished中。
lv.setAdapter(new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, name));
并且不要忘记对JazzyListView globaly进行声明。
修改代码的结尾看起来像。
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);
}
}
}
您需要通过调用notifyDataSetChanged()刷新适配器。 像这样:
lv = (JazzyListView) findViewById(R.id.list);
..
lv.getAdapter().notifyDataSetChanged();
或者,您可以使用如下所示的内容:
// 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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.