java.lang.ClassCastException:无法将适配器强制转换为android.widget.ListView.removeFooterView中的android.widget.HeaderViewListAdapter

时间:2015-09-01 14:32:20

标签: android facebook sdk

我正在使用片段来显示Facebook页面的帖子和事件。用于显示' post'。我正在使用FeedFragment,我正在应用LoadMore来获取下一个Facebook页面的帖子,因此在ListView上我添加了footerView以显示Loadmore。

应用程序在版本4.4.4或更高版本上工作正常,因为我使用版本4.2.2进行测试,因此它在下面的崩溃(4.4.4)。

这是我的FeedFragmentClass

public class FeedsFragment extends Fragment implements View.OnClickListener{
    public static final String ARG_INITIAL_POSITION = "ARG_INITIAL_POSITION";
    AccessToken accessToken;
    @InjectView(R.id.observable_list)
    ObservableListView listView;

    @InjectView(R.id.swipeRefreshLayoutFeeds)
    SwipeRefreshLayout swipeRefreshed;
    @InjectView(R.id.loading_progress_bar)
    ProgressBar loadingProgressBar;
    public FeedAdapter feedAdapter;
    String feedResponseStr;
    View footerView;
    String urlFeeds;
    private static final String FEED_PARAMETERS = "description,message,source,from,attachments{subattachments,media},created_time,type,id,link";
    private ArrayList<Datamodel> dataModels = new ArrayList<>();
    private boolean isLoading, isFirstTime = true;
    private int lastResponseItemCount;
    //parser
    FeedsParserEntity feedsParserEntity;
    String jsonNext = null;
    String facebookPageLimit = "0";
    String limit="25",until,pagingToken;
    int fbPageLimit;
    boolean nextPageFirsttime = false;

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_posts_event, container, false);
        Activity parentActivity = getActivity();
        accessToken = AccessToken.getCurrentAccessToken();
        ButterKnife.inject(this, rootView);

        if (NetworkUtility.isNetworkAvailable(parentActivity)){
            Timber.e("Network is available");
        }else {
            Timber.e("Network not available");
        }
       footerView = inflater.inflate(R.layout.auto_load_more_footer, null, false);
       listView.addHeaderView(inflater.inflate(R.layout.padding, listView, false));

       // listView.addHeaderView(listView,inflater.inflate(R.layout.padding,null),false);

       // setDummyDataWithHeader(listView, inflater.inflate(R.layout.padding, listView, false));


       getFeeds();



        /*
        * Toolbar hide and show on Scrolling activity
        * **/
        if (parentActivity instanceof ObservableScrollViewCallbacks) {
            Bundle args = getArguments();
            if (args != null && args.containsKey(ARG_INITIAL_POSITION)) {
                final int initialPosition = args.getInt(ARG_INITIAL_POSITION, 1);
                ScrollUtils.addOnGlobalLayoutListener(listView, new Runnable() {
                    @Override
                    public void run() {

                        listView.setSelection(initialPosition);
                    }
                });
            }
            listView.setTouchInterceptionViewGroup((ViewGroup) parentActivity.findViewById(R.id.root));
            listView.setScrollViewCallbacks((ObservableScrollViewCallbacks) parentActivity);
        }
        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            int currentScrollState;

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                //Timber.e("currentScrollState::" + currentScrollState);
                currentScrollState = SCROLL_STATE_IDLE;
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                int loadMore = firstVisibleItem + visibleItemCount;
                if (!isLoading) {
                    if (loadMore == totalItemCount && totalItemCount != 0) {
                        if (!isFirstTime && (lastResponseItemCount % fbPageLimit == 0)) {
                           listView.addFooterView(footerView);
                            getFeeds();
                            isLoading = true;
                        }
                    } else {
                        if (listView != null) {
                           listView.removeFooterView(footerView);
                        }
                    }
                } else if (currentScrollState == SCROLL_STATE_IDLE && (totalItemCount - visibleItemCount) <= firstVisibleItem) {
                    Timber.i("No data  found here to load...");
                }
            }
        });


        swipeRefreshed.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                swipeRefreshed.setRefreshing(true);
                isFirstTime = true;
                getFeeds();
            }
        });

        return rootView;
    }

    private void getFeeds() {
        Bundle feedResponse;
        GraphRequest request = new GraphRequest(accessToken,
                "/" + Constant.FACEBOOK_PAGEID + "/feed",
                null,
                HttpMethod.GET,
                new GraphRequest.Callback() {
                    @Override
                    public void onCompleted(GraphResponse graphResponse) {
                        isLoading = false;
                        feedResponseStr = graphResponse.getRawResponse();
                        //Timber.e("feedResponseStr::"+feedResponseStr);
                        if (feedResponseStr != null) {
                            getNextPage(feedResponseStr);
                            parseResponse(feedResponseStr);
                        }

                    }
                });
            if (isFirstTime) {
                isLoading = true;
                feedResponse = new Bundle();
                feedResponse.putString("fields", FEED_PARAMETERS);

                if (nextPageFirsttime){
                    feedResponse.putString("limit",limit);
                    feedResponse.putString("_paging_token",pagingToken);
                    feedResponse.putString("until", until);
                }

            } else {
                feedResponse = new Bundle();
                feedResponse.putString("limit",limit);
                feedResponse.putString("_paging_token",pagingToken);
                feedResponse.putString("until", until);
                feedResponse.putString(Constant.FIELDS, FEED_PARAMETERS);
            }
            request.setParameters(feedResponse);
            request.executeAsync();
    }

    private void getNextPage(String feedResponseStr) {

        JSONObject json = null;
        try {
            json = new JSONObject(feedResponseStr);
        } catch (JSONException e) {
            e.printStackTrace();
        }


        JSONObject json_LL = null;
        try {
            assert json != null;
            json_LL = json.getJSONObject("paging");
            jsonNext = json_LL.optString("next");
            if (jsonNext == null){
                return;
            }
            String tempNext = jsonNext;
            //newNextJson = tempNext.replace("https://graph.facebook.com/v2.3/","");
            String limitArray[] = tempNext.split("&");
            int limitposition = Arrays.asList(limitArray).indexOf("limit=25");

            String limitFirst[] = limitArray[limitposition].split("=");
            limit = limitFirst[1];
            facebookPageLimit = limit;
            try {
                fbPageLimit = Integer.parseInt(facebookPageLimit);
            }catch (NumberFormatException e){
                e.printStackTrace();
            }

            String untilFirst[] = limitArray[4].split("=");
            until = untilFirst[1];

            String pagingTokenFirst[] = limitArray[5].split("=");
            pagingToken = pagingTokenFirst[1];
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    private void parseResponse(String feedResponseStr) {

        Gson gson = new Gson();
        feedsParserEntity = gson.fromJson(feedResponseStr,FeedsParserEntity.class);

        //if first call does not contain any post
        if (feedsParserEntity.getDatamodels(getActivity()).size()==0){
            if (isFirstTime){
                nextPageFirsttime = true;
                getFeeds();
            }
        }

        /**
         *if it is not first call but pageResponse limit is less than faceBook Bydefault limit
         */

        if (!isFirstTime && feedsParserEntity.getData().size() <= fbPageLimit - 1) {
                lastResponseItemCount = feedsParserEntity.getData().size();
                listView.removeFooterView(footerView);
                ArrayList<Datamodel> lastDataModel = new ArrayList<>();
                lastDataModel.addAll(feedsParserEntity.getDatamodels(getActivity()));
                dataModels.addAll(lastDataModel);

          //  ((feedAdapter)(HeaderViewListAdapter)listView.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
            feedAdapter.notifyDataSetChanged();
            return;
        }

        if (isFirstTime) {

            if (listView != null){
                dataModels.clear();
            }
            dataModels.addAll(feedsParserEntity.getDatamodels(getActivity()));
            setUpList();
            isFirstTime = false;
        }else {
            ArrayList<Datamodel> newDataModel = new ArrayList<>();
            newDataModel.addAll(feedsParserEntity.getDatamodels(getActivity()));
            if (!(nextPageFirsttime)){
                newDataModel.remove(0);
                //nextPageFirsttime = false;
            }
            // feedsParserEntity.getDatamodels().remove(0);
            dataModels.addAll(newDataModel);
            feedAdapter.notifyDataSetChanged();
            nextPageFirsttime = false;
        }
    }

    private void setUpList() {
        loadingProgressBar.setVisibility(View.GONE);
        listView.addFooterView(footerView);
        feedAdapter = new FeedAdapter(getActivity(),dataModels);
        listView.setAdapter(feedAdapter);
        if (listView != null){
            swipeRefreshed.setRefreshing(false);
        }
    }


    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.reset(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case 1:
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setData(Uri.parse(urlFeeds));
                startActivity(i);
        }
    }

}//feedsfragment

这是logcat:我按照序列

  1. 添加FooterView。
  2. SetAdapter
  3. 删除FooterView

    09-01 23:12:35.962 15538-15538 / com.sample.example E / AndroidRuntime:FATAL EXCEPTION:main         java.lang.ClassCastException:com.efivolunteer.android.adapter.FeedAdapter无法强制转换为android.widget.HeaderViewListAdapter                 在android.widget.ListView.removeFooterView(ListView.java:396)                 at com.efivolunteer.android.fragments.FeedsFragment.parseResponse(FeedsFragment.java:283)                 at com.efivolunteer.android.fragments.FeedsFragment.access $ 500(FeedsFragment.java:44)                 at com.efivolunteer.android.fragments.FeedsFragment $ 4.onCompleted(FeedsFragment.java:173)                 在com.facebook.GraphRequest $ 5.run(GraphRequest.java:1243)                 在android.os.Handler.handleCallback(Handler.java:725)                 在android.os.Handler.dispatchMessage(Handler.java:92)                 在android.os.Looper.loop(Looper.java:176)                 在android.app.ActivityThread.main(ActivityThread.java:5317)                 at java.lang.reflect.Method.invokeNative(Native Method)                 在java.lang.reflect.Method.invoke(Method.java:511)                 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1102enter code here)                 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)                 在dalvik.system.NativeStart.main(本地方法)

  4. 我带来了解决方案,我使用的序列如下: -

    1. 添加页脚
    2. 进行API调用,并在获得响应后将其设置为适配器。
    3. 当List为null时删除标题。
    4. 现在适用于S2(V-4.2.2) 在kitkat之后的版本中放宽了对序列的限制。(v4.4.4)。

0 个答案:

没有答案