添加项目后,ArrayList的大小为0

时间:2014-11-25 04:00:27

标签: java android android-listview arraylist android-adapter

我在一个类中声明了ArrayList并在启动Async任务时启动它;然后我在doInBackGround()方法中添加项目,但之后,当我将数组列表发送到适配器的构造函数时,数组列表的大小仍为0.

我真的不知道我做错了什么。请帮助。

这是我的代码:

public class FindNewThingFragment extends android.support.v4.app.Fragment {
    private PullRefreshLayout pullRefreshLayout;
    private ProgressBar progressBar;
    private ListView listView;
    private ArrayList<ThingsItem> arrayList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_found_new_thing,container,false);
    listView=(ListView)view.findViewById(R.id.things_item_list_view);
    progressBar=(ProgressBar)view.findViewById(R.id.things_item_progress_bar);
    new LoadDongxiData().execute();
    ThingsItemListViewAdapter adapter=new ThingsItemListViewAdapter(getActivity(),arrayList);
    listView.setAdapter(adapter);

    return view;
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

private class LoadDongxiData extends AsyncTask<Void,Void,Void> {
    public LoadDongxiData(){
        arrayList=new ArrayList<ThingsItem>();
    }

    @Override
    protected Void doInBackground(Void... voids) {
            doSomething();
            for(int i=0;i<10;i++){}
                arrayList.add(new ThingsItem(itemImageUrl, itemName, price, userIconUrl, userName, userComment, numberOfLikes, numberOfAddDouToList, numberOfReply, userHomePageLink, itemDetailLink));
            }
        }

    }
}


}

6 个答案:

答案 0 :(得分:0)

for(int i=0;i<10;i++){}  

这个空循环是故意的还是你试图添加项目的地方?从你的括号缩进的方式来看,它似乎不是故意的。如果这是一个时间延迟,从1到10的计数将花费不到一秒的时间。

设置完数据后,只需在adapter.notifyDataSetChanged()中拨打onPostExecute()即可。

您可以在onCreate()中设置适配器。每次适配器的基础数据发生变化时,请不要忘记调用adapter.notifyDataSetChanged()。但是,您需要将adapter设为“全局”变量。

答案 1 :(得分:0)

更改您的代码,

public class FindNewThingFragment extends android.support.v4.app.Fragment {
    private PullRefreshLayout pullRefreshLayout;
    private ProgressBar progressBar;
    private ListView listView;
    private ArrayList<ThingsItem> arrayList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_found_new_thing,container,false);
    listView=(ListView)view.findViewById(R.id.things_item_list_view);
    progressBar=(ProgressBar)view.findViewById(R.id.things_item_progress_bar);
    new LoadDongxiData().execute();

    return view;
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

private class LoadDongxiData extends AsyncTask<Void,Void,Void> {
    public LoadDongxiData(){
        arrayList=new ArrayList<ThingsItem>();
    }

    @Override
    protected Void doInBackground(Void... voids) {
            doSomething();
            for(int i=0;i<10;i++){
              arrayList.add(new ThingsItem(itemImageUrl, itemName, price, userIconUrl, userName, userComment, numberOfLikes, numberOfAddDouToList, numberOfReply, userHomePageLink, itemDetailLink));

             }

            }

 protected void onPostExecute(Long result) {
if(arrayList != null && arrayList.size() > 0){
            ThingsItemListViewAdapter adapter=new ThingsItemListViewAdapter(getActivity(),arrayList);
    listView.setAdapter(adapter);
}
     }

        }

    }
}


}

答案 2 :(得分:0)

将适配器设置为onPostExecute

Asynctask

答案 3 :(得分:0)

请注意,AsyncTask将在后台运行。当它在后台运行时,UI线程将在

之前进入代码的下一行
new LoadDongxiData().execute();

这一行完成它的执行下一行将被调用。所以arraylist大小仍为0。

解决方案是你在LoadDongxiData()完成执行后应该有这一行。

ThingsItemListViewAdapter adapter=new ThingsItemListViewAdapter(getActivity(),arrayList);
listView.setAdapter(adapter);

在LoadDongxiData的onPostExecute()方法之后调用这些行。

答案 4 :(得分:0)

尝试将项目添加到列表并在onPostExecute中设置适配器代码:

@Override
protected void onPostExecute(Void aVoid) {
   super.onPostExecute(aVoid);
   for(int i=0;i<10;i++) {
       arrayList.add(new ThingsItem(itemImageUrl, itemName, price, userIconUrl, userName, userComment, numberOfLikes, numberOfAddDouToList, numberOfReply, userHomePageLink, itemDetailLink));
   }
   ThingsItemListViewAdapter adapter=new ThingsItemListViewAdapter(getActivity(),arrayList);
   listView.setAdapter(adapter);
}

答案 5 :(得分:0)

更新你的doInBackground()方法......

     protected Void doInBackground(Void... voids) {
            doSomething();
            for(int i=0;i<10;i++){
                arrayList.add(new ThingsItem(itemImageUrl, itemName, price, userIconUrl, userName, userComment, numberOfLikes, numberOfAddDouToList, numberOfReply, userHomePageLink, itemDetailLink));

              }
            }
        }