【问题标题】:List size is zero even after adding items即使添加项目后列表大小也为零
【发布时间】:2015-08-19 06:26:31
【问题描述】:

我有一个列表,我发送到后台 asynctask 对象来做一些工作。我还发送了一个自定义列表适配器,以便能够在后台填充我的列表。但是列表返回零,并且似乎没有添加任何内容,因为它的大小保持为零。我知道,因为我调试过它。我的自定义列表适配器工作得很好,并且完美地创建了列表。

这是我的代码。

Fragment_Events.java

public class Fragment_Events extends android.support.v4.app.Fragment implements AdapterView.OnItemClickListener {

    FragmentController controller;

    ListView eventsListView;
    List<Event> events;
    EventsListAdapter eventsListAdapter;

    public Fragment_Events() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        controller = (FragmentController) getActivity();
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        eventsListView = (ListView)getActivity().findViewById(R.id.listView_events);
        events = new ArrayList<Event>();//SIZE REMAINS 0 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        eventsListAdapter = new EventsListAdapter(getActivity(),R.layout.list_events,events);
        eventsListView.setAdapter(eventsListAdapter);

        DLEvents.init(events,eventsListAdapter);
        Bundle sendingBundle = new Bundle();
        ArrayList<String> eventNames = new ArrayList<String>();


        sendingBundle.putStringArrayList(AppUtils.EVENT_NAMES,eventNames);
        controller.sendData(sendingBundle);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_events, container, false);
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    }
}

DLEvents.java

public class DLEvents {

    public static final String EVENTS_OBJECT = "Events";
    public static final String NAME_COLUMN = "name";
    public static final String DESC_COLUMN = "description";
    public static final String DATE_COLUMN = "date";
    public static final String FOLL_COLUMN = "followers";
    public static final String TC_COLUMN = "ticketCount";
    public static final String IMAGE_COLUMN = "image";

    public static void init(List<Event> list,EventsListAdapter eventsListAdapter){

        DownLoadData downLoadData = new DownLoadData(list,eventsListAdapter);
        downLoadData.execute();
    }


    public static class DownLoadData extends AsyncTask<Void,Event,Void>{

        public List<Event>events;
        public EventsListAdapter eventsListAdapter;

        public DownLoadData(List<Event>events, EventsListAdapter eventsListAdapter) {

            super();
            this.events = events;
            this.eventsListAdapter = eventsListAdapter;

        }



        public Bitmap byteArrayToBitmap(byte[] bytes){
            Bitmap temp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            return temp;
        }


        @Override
        protected Void doInBackground(Void... params) {
            ParseQuery<ParseObject> query = ParseQuery.getQuery(EVENTS_OBJECT);
            try {
                for(ParseObject tempParseObject: query.find()){
                    String tempName = tempParseObject.getString(NAME_COLUMN);
                    String tempDesc = tempParseObject.getString(DESC_COLUMN);
                    String tempID  = tempParseObject.getObjectId();
                    int tempTC = tempParseObject.getInt(TC_COLUMN);
                    ParseFile tempPF = (ParseFile)tempParseObject.get(IMAGE_COLUMN);

                    Bitmap tempBM = byteArrayToBitmap(tempPF.getData());
                    int tempFoll = tempParseObject.getInt(FOLL_COLUMN);
                    Event event = new Event(tempName,tempDesc,null,tempID,tempTC,tempBM,tempFoll);
                    publishProgress(event);
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Event... values) {
            super.onProgressUpdate(values);
            //events.add(values[0]); //I commented it out because it causes my listview to have duplicates, if you can shed some light on this too , I'd appreciate it. Commenting it back in also doesn't affect the size of my list
            eventsListAdapter.add(values[0]);

        }
    }

}

Asynctask 似乎工作正常,因为列表填充没有问题。但是列表仍然是大小为 0 的事件,尽管它已通过 onprogressreport 在 UI 线程中更新

适配器完美地填充列表!那不是问题。传递给 asynctask 的事件列表的大小保持为零。没有添加任何项目。这就是问题所在。

【问题讨论】:

    标签: java android arrays list


    【解决方案1】:

    您必须致电notifyDataSetChanged() 来更新适配器并让它知道有新数据。

    @Override
    protected void onProgressUpdate(Event... values) {
        super.onProgressUpdate(values);
        //events.add(values[0]); //I commented it out because it causes my listview to have duplicates, if you can shed some light on this too , I'd appreciate it. Commenting it back in also doesn't affect the size of my list
        eventsListAdapter.add(values[0]);
        eventsListAdapter.notifyDataSetChanged();
    }
    

    【讨论】:

    • 正如我所说的适配器工作。该列表填充没有问题。事件列表的大小保持为零
    【解决方案2】:

    一旦数据可用或其数据被修改,您需要要求适配器刷新自身。

    这样做

    @Override
    protected void onProgressUpdate(Event... values) {
        super.onProgressUpdate(values);
        events.add(values[0]); 
        eventsListAdapter.add(values[0]);
        eventsListAdapter.notifyDataSetChanged();
    }
    

    【讨论】:

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