我正在使用片段来显示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:我按照序列
删除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(本地方法)
我带来了解决方案,我使用的序列如下: -
现在适用于S2(V-4.2.2) 在kitkat之后的版本中放宽了对序列的限制。(v4.4.4)。