原文地址
在上一篇文章中完成了今日热闻的相关代码,这次来完成侧滑菜单中的点击响应,每个item都有对应的页面。
先上效果图:
在写各类文章的界面前,先把今日热闻的下拉刷新逻辑和自动加载更多的功能完成。
还记得之前处理swiperefreshlayout与listview的滑动冲突吗?就是在那里添加:
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (lv_news != null && lv_news.getChildCount() > 0) {
boolean enable = (firstVisibleItem == 0) && (view.getChildAt(firstVisibleItem).getTop() == 0);
((MainActivity) mActivity).setSwipeRefreshEnable(enable);
if (firstVisibleItem + visibleItemCount == totalItemCount && !isLoading) {
loadMore(Constant.BEFORE + date);
}
}
}
loadMore方法:
private void loadMore(final String url) {
isLoading = true;
HttpUtils.get(url, new TextHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
Gson gson = new Gson();
before = gson.fromJson(responseString, Before.class);
date = before.getDate();
handler.post(new Runnable() {
@Override
public void run() {
List<StoriesEntity> storiesEntities = before.getStories();
StoriesEntity topic = new StoriesEntity();
topic.setType(Constant.TOPIC);
topic.setTitle(convertDate(date));
storiesEntities.add(0, topic);
mAdapter.addList(storiesEntities);
isLoading = false;
}
});
}
});
}
还有自动刷新的逻辑实现(目前只实现了今日热闻的刷新):
sr.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
replaceFragment();
sr.setRefreshing(false);
}
});
public void replaceFragment() {
if (curId.equals("latest")) {
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_from_right, R.anim.slide_out_to_left)
.replace(R.id.fl_content,
new MainFragment(), "latest").commit();
} else {
}
}
然后就是今天的重点了,首先去实现侧滑菜单栏的点击事件:
lv_item.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
getFragmentManager()
.beginTransaction().setCustomAnimations(R.anim.slide_in_from_right, R.anim.slide_out_to_left)
.replace(
R.id.fl_content,
new NewsFragment(items.get(position)
.getId()), "news").commit();
((MainActivity) mActivity).setCurId(items.get(position).getId());
((MainActivity) mActivity).closeMenu();
}
});
其实就是按照点击的position来获取对应的id,然后发出请求,动态的用Fragment来展示。
这才是主角:
package krelve.app.kuaihu.fragment;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.google.gson.Gson;
import com.loopj.android.http.TextHttpResponseHandler;
import com.nostra13.universalimageloader.core.ImageLoader;
import org.apache.http.Header;
import java.util.ArrayList;
import krelve.app.kuaihu.R;
import krelve.app.kuaihu.activity.MainActivity;
import krelve.app.kuaihu.adapter.NewsItemAdapter;
import krelve.app.kuaihu.model.News;
import krelve.app.kuaihu.util.Constant;
import krelve.app.kuaihu.util.HttpUtils;
/**
* Created by wwjun.wang on 2015/8/14.
*/
@SuppressLint("ValidFragment")
public class NewsFragment extends BaseFragment {
private ImageLoader mImageLoader;
private ListView lv_news;
private ImageView iv_title;
private TextView tv_title;
private String urlId;
private News news;
public NewsFragment(String id) {
urlId = id;
}
@Override
protected View initView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.news_layout, container, false);
mImageLoader = ImageLoader.getInstance();
lv_news = (ListView) view.findViewById(R.id.lv_news);
View header = LayoutInflater.from(mActivity).inflate(
R.layout.news_header, lv_news, false);
iv_title = (ImageView) header.findViewById(R.id.iv_title);
tv_title = (TextView) header.findViewById(R.id.tv_title);
lv_news.addHeaderView(header);
// lv_news.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//
// @Override
// public void onItemClick(AdapterView<?> parent, View view,
// int position, long id) {
// NewsItem newsItem = (NewsItem) parent.getAdapter().getItem(
// position);
// Intent intent = new Intent(getActivity(),
// ThemeNewsContentActivity.class);
// intent.putExtra("id", newsItem.getId());
// intent.putExtra("title", newsItem.getTitle());
// startActivity(intent);
// }
// });
lv_news.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 (lv_news != null && lv_news.getChildCount() > 0) {
boolean enable = (firstVisibleItem == 0) && (view.getChildAt(firstVisibleItem).getTop() == 0);
((MainActivity) mActivity).setSwipeRefreshEnable(enable);
}
}
});
return view;
}
@Override
protected void initData() {
super.initData();
HttpUtils.get(Constant.THEMENEWS + urlId, new TextHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
Gson gson = new Gson();
news = gson.fromJson(responseString, News.class);
tv_title.setText(news.getDescription());
mImageLoader.displayImage(news.getImage(), iv_title);
lv_news.setAdapter(new NewsItemAdapter(mActivity, news.getStories()));
}
});
}
}
在完成了今日热闻后,对上面的代码肯定不陌生,因为它们有着惊人的相似,上面用到的所有bean都是用GsonFormat自动生成的,不过由于有很多重复的地方,所以我把StoriesEntity抽取了出来。
看到这里,就会发现其实今天的内容就是对上篇文章的扩展,从个体扩展到通用,所以很多xml文件就不贴了,可以在github上看,今天的内容已经同步上去。
高仿知乎日报
个人博客——krelve.com