当无限列表视图被srcrolled时,应用程序崩溃

时间:2017-02-19 13:22:03

标签: android listview android-asynctask

我有一个片段类,我在其中使用asynctask加载listview数据。 一旦用户到达滚动的结尾,我需要加载另一组数据。

 listView.setOnScrollListener(new AbsListView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

                if (userListAdapter == null)
                    return;

                if (userListAdapter.getCount() == 0)
                    return;

                int l = visibleItemCount + firstVisibleItem;
                if (l >= totalItemCount && !isLoading) {
                    // It is time to add new data. We call the listener
                    listView.addFooterView(footer);
                    isLoading = true;
                    listener.loadData();
                }
            }
        });

我在loaddata中收到回调

 @Override
    public void loadData() {
        if (connection != null) {
             connection.getmService().new FetchJsonData().execute(Constants.WEEK_URL1);
        }

    }

我的适配器代码。

    public class UserListAdapter extends BaseAdapter {

    private LayoutInflater layoutInflater;
    private ArrayList<UserInfoModel> userInfoModelArrayList;

    public UserListAdapter(Context context, ArrayList<UserInfoModel> userInfoModelArrayList) {
        this.userInfoModelArrayList = userInfoModelArrayList;
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return userInfoModelArrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return userInfoModelArrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (null == convertView) {
            convertView = layoutInflater.inflate(R.layout.list_row, parent,false);
            viewHolder = new ViewHolder();
            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.image_view);
            viewHolder.userName = (TextView) convertView.findViewById(R.id.user_name);
            viewHolder.userID = (TextView) convertView.findViewById(R.id.userID);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.userName.setText(userInfoModelArrayList.get(position).getUserName());
        viewHolder.userID.setText(userInfoModelArrayList.get(position).getUserID());
        return convertView;
    }


    public void setFilter(ArrayList<UserInfoModel> informationArrayList) {
        userInfoModelArrayList = new ArrayList<>();
        userInfoModelArrayList.addAll(informationArrayList);
        notifyDataSetChanged();

    }

    public void setData(ArrayList<UserInfoModel> informationArrayList) {
        userInfoModelArrayList.addAll(informationArrayList);
        notifyDataSetChanged();
    }


    private static class ViewHolder {
        ImageView imageView;
        TextView userName;
        TextView userID;
    }
}

但是我的应用程序崩溃,一旦它到达第一组数据,我在listview的页脚添加了进度条。

错误日志

02-19 18:45:09.757 3114-3114/example.service.android.santosh.com.androidservice E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                                  Process: example.service.android.santosh.com.androidservice, PID: 3114
                                                                                                  java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference
                                                                                                      at android.widget.AbsListView.obtainView(AbsListView.java:2363)
                                                                                                      at android.widget.ListView.makeAndAddView(ListView.java:1876)
                                                                                                      at android.widget.ListView.fillDown(ListView.java:702)
                                                                                                      at android.widget.ListView.fillGap(ListView.java:666)
                                                                                                      at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5060)
                                                                                                      at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4608)
                                                                                                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
                                                                                                      at android.view.Choreographer.doCallbacks(Choreographer.java:670)
                                                                                                      at android.view.Choreographer.doFrame(Choreographer.java:603)
                                                                                                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
                                                                                                      at android.os.Handler.handleCallback(Handler.java:746)
                                                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                                      at android.os.Looper.loop(Looper.java:148)
                                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

请帮忙谢谢:)

2 个答案:

答案 0 :(得分:0)

你有没有尝试过这样的事情......

MyViewHolder viewHolder = null;

if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        viewHolder = new MyViewHolder();;
        convertView = inflater.inflate(R.layout.all_brands_layout_search, null);
        viewHolder.imageOne = (DynamicHeightImageView) convertView.findViewById(R.id.my_brand_pinrest_view);
        convertView.setTag(viewHolder);
    }else{
 viewHolder= (MyViewHolder)convertView.getTag();
 }

这应该是编写适配器的理想方式。

答案 1 :(得分:0)

我已经解决了这个问题与adpater无关的问题,因为在listview页脚的滚动条中添加页脚视图应该在创建片段时添加。

<强>的onCreate

View footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.loading_view, null, false);
        listView.addFooterView(footerView);

onScroll

if (l >= totalItemCount && !isLoading) {
                    // It is time to add new data. We call the listener
                    isLoading = true;
                    listener.loadData();
                } 

它解决了我的问题。顺便说一句,谢谢大家:))