【问题标题】:Size of ArrayList is 0 after adding items to it向其添加项目后,ArrayList 的大小为 0
【发布时间】:2014-11-25 04:00:27
【问题描述】:

我在一个类中声明了一个ArrayList,并在我启动异步任务时启动它;然后我在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));
            }
        }

    }
}


}

【问题讨论】:

  • 尝试将项目添加到 onPostExecute 列表中,并在那里设置适配器。
  • 您确定将其设置为适配器之后?后台任务可能还没有完成。
  • @Thilo 只需在onPostExecute() 中调用notifyDataSetChanged()? :)

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


【解决方案1】:

如下修改你的代码:

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);
            }
        }
    }
}

【讨论】:

  • 也可以将arrayList 设为任务的私有字段。
【解决方案2】:

将您的适配器设置为onPostExecuteAsynctask

【讨论】:

    【解决方案3】:

    请注意,您的 AsyncTask 将在后台运行。当它在后台运行时,UI 线程将继续执行代码的下一行,这意味着在

    new LoadDongxiData().execute();
    

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

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

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

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

    【讨论】:

      【解决方案4】:

      尝试将添加项移动到列表并在 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】:

        更新您的 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));
        
                      }
                    }
                }
        

        【讨论】:

          【解决方案6】:
          for(int i=0;i<10;i++){}  
          

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

          设置数据后,只需在onPostExecute() 中调用adapter.notifyDataSetChanged()

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多