acvitity_main:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/vp_splash"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/btn_goto_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:text="进入页面"
android:visibility="gone" />
</RelativeLayout>
activity_login:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp">
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码" />
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录" />
</LinearLayout>
activity_home:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/tbl_news"
android:layout_width="match_parent"
android:layout_height="wrap_content"></android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/vp_news"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v4.view.ViewPager>
</LinearLayout>
fragment_news:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/vp_banner"
android:layout_width="match_parent"
android:layout_height="200dp"></android.support.v4.view.ViewPager>
<com.bwie.xlistview.XListView
android:id="@+id/xlv_news"
android:layout_width="match_parent"
android:layout_height="wrap_content"></com.bwie.xlistview.XListView>
</LinearLayout>
fragment_empty:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/vp_banner"
android:layout_width="match_parent"
android:layout_height="200dp"></android.support.v4.view.ViewPager>
<com.bwie.xlistview.XListView
android:id="@+id/xlv_news"
android:layout_width="match_parent"
android:layout_height="wrap_content"></com.bwie.xlistview.XListView>
</LinearLayout>
public class HttpUtils {
public static String getStringFromHttp(String urlString) {
String result = "";
try {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(false);
connection.setConnectTimeout(5000);
connection.connect();
if (connection.getResponseCode() == 200) {
InputStream is = connection.getInputStream();
result = getStringFromInputStream(is);
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
private static String getStringFromInputStream(InputStream is) {
String result = "";
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int length = -1;
byte[] buffer = new byte[1024];
while ((length = is.read(buffer, 0, buffer.length)) != -1) {
baos.write(buffer, 0, length);
baos.flush();
}
result = baos.toString();
baos.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
public class NetUtils {
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo == null) {
return false;
}
return networkInfo.isAvailable();
}
}
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "news.db";
private static final int DB_VERSION = 1;
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table " + NewsDao.TABLE_NAME + "(" +
NewsDao.COLUMN_ID + " text primary key," +
NewsDao.COLUMN_TITLE + " text," +
NewsDao.COLUMN_DATE + " text," +
NewsDao.COLUMN_CATEGORY + " text," +
NewsDao.COLUMN_AUTHOR_NAME + " text," +
NewsDao.COLUMN_URL + " text," +
NewsDao.COLUMN_THUMBNAIL_01 + " text," +
NewsDao.COLUMN_THUMBNAIL_02 + " text," +
NewsDao.COLUMN_THUMBNAIL_03 + " text)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public class NewsDao {
public static final String TABLE_NAME = "news";
public static final String COLUMN_ID = "id";
public static final String COLUMN_TITLE = "title";
public static final String COLUMN_DATE = "_date";
public static final String COLUMN_CATEGORY = "category";
public static final String COLUMN_AUTHOR_NAME = "author_name";
public static final String COLUMN_URL = "url";
public static final String COLUMN_THUMBNAIL_01 = "thumbnail01";
public static final String COLUMN_THUMBNAIL_02 = "thumbnail02";
public static final String COLUMN_THUMBNAIL_03 = "thumbnail03";
private final SQLiteDatabase db;
public NewsDao(Context context) {
DBHelper helper = new DBHelper(context);
db = helper.getWritableDatabase();
}
public int insert(List<News.DataBean> news) {
int count = 0;
ContentValues values = new ContentValues();
for (News.DataBean dataBean : news) {
if (!hasId(dataBean.getUniquekey())) {
values.put(COLUMN_ID, dataBean.getUniquekey());
values.put(COLUMN_TITLE, dataBean.getTitle());
values.put(COLUMN_DATE, dataBean.getDate());
values.put(COLUMN_CATEGORY, dataBean.getCategory());
values.put(COLUMN_AUTHOR_NAME, dataBean.getAuthorName());
values.put(COLUMN_URL, dataBean.getUrl());
values.put(COLUMN_THUMBNAIL_01, TextUtils.isEmpty(dataBean.getThumbnail01()) ? "" : dataBean.getThumbnail01());
values.put(COLUMN_THUMBNAIL_02, TextUtils.isEmpty(dataBean.getThumbnail02()) ? "" : dataBean.getThumbnail02());
values.put(COLUMN_THUMBNAIL_03, TextUtils.isEmpty(dataBean.getThumbnail03()) ? "" : dataBean.getThumbnail03());
long l = db.insert(TABLE_NAME, null, values);
if (l > 0) {
count++;
}
}
}
return count;
}
public List<News.DataBean> queryByPage(int page) {
List<News.DataBean> list = new ArrayList<>();
String limit = (page - 1) * 30 + ", 30";
Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null, limit);
while (cursor.moveToNext()) {
News.DataBean bean = new News.DataBean();
bean.setUniquekey(cursor.getString(cursor.getColumnIndex(COLUMN_ID)));
bean.setTitle(cursor.getString(cursor.getColumnIndex(COLUMN_TITLE)));
bean.setCategory(cursor.getString(cursor.getColumnIndex(COLUMN_CATEGORY)));
bean.setDate(cursor.getString(cursor.getColumnIndex(COLUMN_DATE)));
bean.setAuthorName(cursor.getString(cursor.getColumnIndex(COLUMN_AUTHOR_NAME)));
bean.setUrl(cursor.getString(cursor.getColumnIndex(COLUMN_URL)));
String th1 = cursor.getString(cursor.getColumnIndex(COLUMN_THUMBNAIL_01));
String th2 = cursor.getString(cursor.getColumnIndex(COLUMN_THUMBNAIL_02));
String th3 = cursor.getString(cursor.getColumnIndex(COLUMN_THUMBNAIL_03));
bean.setThumbnail01(TextUtils.isEmpty(th1) ? "" : th1);
bean.setThumbnail02(TextUtils.isEmpty(th1) ? "" : th2);
bean.setThumbnail03(TextUtils.isEmpty(th1) ? "" : th3);
list.add(bean);
}
return list;
}
public boolean hasId(String id) {
Cursor cursor = db.query(TABLE_NAME, null, COLUMN_ID + "=?", new String[]{id}, null, null, null);
if (cursor.moveToNext()) {
return true;
}
return false;
}
}
public class ServerUrl {
public static final String LOGIN_URL = "https://www.zhaoapi.cn/user/login?";
public static final String BANNER_URL = "http://www.xieast.com/api/banner.php";
public static final String NEWS_URL = "http://www.xieast.com/api/news/news.php?page=";
}
public abstract class BaseActivity extends AppCompatActivity {
protected Context mContext;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
previewAction();
setContentView(getContentView());
initView();
initData();
setListener();
setMoreAction();
}
protected void previewAction() {
}
protected abstract int getContentView();
protected abstract void initView();
protected void initData() {
}
protected void setListener() {
}
protected void setMoreAction() {
}
}
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
.build();
ImageLoader.getInstance().init(configuration);
}
}
public class NewsAdapter extends BaseAdapter {
private Context context;
private List<News.DataBean> list;
private static final int TYPE_ONE_PIC = 0;
private static final int TYPE_TWO_PIC = 1;
private static final int TYPE_THREE_PIC = 2;
public NewsAdapter(Context context, List<News.DataBean> list) {
this.context = context;
this.list = list;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
News.DataBean bean = list.get(position);
if (!TextUtils.isEmpty(bean.getThumbnail03())) {
return TYPE_THREE_PIC;
} else if (!TextUtils.isEmpty(bean.getThumbnail02())) {
return TYPE_TWO_PIC;
} else {
return TYPE_ONE_PIC;
}
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder1 holder1 = null;
ViewHolder2 holder2 = null;
ViewHolder3 holder3 = null;
int type = getItemViewType(position);
switch (type) {
case TYPE_ONE_PIC:
if (convertView == null) {
holder1 = new ViewHolder1();
convertView = View.inflate(context, R.layout.item_news_01, null);
holder1.txtTitle = convertView.findViewById(R.id.txt_title);
holder1.imgLogo1 = convertView.findViewById(R.id.img_logo);
convertView.setTag(holder1);
} else {
holder1 = (ViewHolder1) convertView.getTag();
}
holder1.txtTitle.setText(list.get(position).getTitle());
ImageLoader.getInstance().displayImage(list.get(position).getThumbnail01(),
holder1.imgLogo1);
break;
case TYPE_TWO_PIC:
if (convertView == null) {
holder2 = new ViewHolder2();
convertView = View.inflate(context, R.layout.item_news_02, null);
holder2.txtTitle = convertView.findViewById(R.id.txt_title);
holder2.imgLogo1 = convertView.findViewById(R.id.img_logo1);
holder2.imgLogo2 = convertView.findViewById(R.id.img_logo2);
convertView.setTag(holder2);
} else {
holder2 = (ViewHolder2) convertView.getTag();
}
holder2.txtTitle.setText(list.get(position).getTitle());
ImageLoader.getInstance().displayImage(list.get(position).getThumbnail01(),
holder2.imgLogo1);
ImageLoader.getInstance().displayImage(list.get(position).getThumbnail02(),
holder2.imgLogo2);
break;
case TYPE_THREE_PIC:
if (convertView == null) {
holder3 = new ViewHolder3();
convertView = View.inflate(context, R.layout.item_news_03, null);
holder3.txtTitle = convertView.findViewById(R.id.txt_title);
holder3.imgLogo1 = convertView.findViewById(R.id.img_logo1);
holder3.imgLogo2 = convertView.findViewById(R.id.img_logo2);
holder3.imgLogo3 = convertView.findViewById(R.id.img_logo3);
convertView.setTag(holder3);
} else {
holder3 = (ViewHolder3) convertView.getTag();
}
holder3.txtTitle.setText(list.get(position).getTitle());
ImageLoader.getInstance().displayImage(list.get(position).getThumbnail01(),
holder3.imgLogo1);
ImageLoader.getInstance().displayImage(list.get(position).getThumbnail02(),
holder3.imgLogo2);
ImageLoader.getInstance().displayImage(list.get(position).getThumbnail03(),
holder3.imgLogo3);
break;
}
return convertView;
}
class ViewHolder1 {
ImageView imgLogo1;
TextView txtTitle;
}
class ViewHolder2 {
ImageView imgLogo1;
ImageView imgLogo2;
TextView txtTitle;
}
class ViewHolder3 {
ImageView imgLogo1;
ImageView imgLogo2;
ImageView imgLogo3;
TextView txtTitle;
}
}
public class EmptyFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private TextView txtShow;
public EmptyFragment() {
}
public static EmptyFragment newInstance(String param) {
EmptyFragment fragment = new EmptyFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_empty, container, false);
txtShow = v.findViewById(R.id.txt_show);
return v;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle bundle = getArguments();
String str = bundle.getString(ARG_PARAM1);
txtShow.setText(str);
}
}
public class NewsFragment extends Fragment {
private int page = 1;
private ViewPager vpBanner;
private XListView xlvNews;
private NewsAdapter adapter;
private List<News.DataBean> list;
private boolean isLoadMore = false;
private NewsDao dao;
private Handler handler = new Handler();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_news, container, false);
vpBanner = v.findViewById(R.id.vp_banner);
xlvNews = v.findViewById(R.id.xlv_news);
return v;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initData();
setListerner();
getBanner();
getNews();
}
private void setListerner() {
xlvNews.setXListViewListener(new XListView.IXListViewListener() {
@Override
public void onRefresh() {
page = 1;
isLoadMore = false;
getNews();
}
@Override
public void onLoadMore() {
page++;
isLoadMore = true;
getNews();
}
});
}
private void initData() {
xlvNews.setPullLoadEnable(true);
xlvNews.setPullRefreshEnable(true);
dao = new NewsDao(getActivity());
list = new ArrayList<>();
adapter = new NewsAdapter(getActivity(), list);
xlvNews.setAdapter(adapter);
}
private void getBanner() {
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... strings) {
return HttpUtils.getStringFromHttp(strings[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Gson gson = new Gson();
Banner banner = gson.fromJson(s, Banner.class);
if (banner != null) {
final List<Banner.DataBean> data = banner.getData();
vpBanner.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return data.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
ImageView img = new ImageView(getActivity());
ImageLoader.getInstance().displayImage(data.get(position).getImg(), img);
container.addView(img);
return img;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
});
}
}
}.execute(ServerUrl.BANNER_URL);
}
private void getNews() {
if (NetUtils.isNetworkAvailable(getActivity())) {
getNewsFromHttp();
} else {
getNewsFromDB();
}
}
private void getNewsFromDB() {
List<News.DataBean> data = dao.queryByPage(page);
if (data != null) {
if (!isLoadMore) {
list.clear();
}
list.addAll(data);
adapter.notifyDataSetChanged();
}
}
private void getNewsFromHttp() {
String url = ServerUrl.NEWS_URL + page;
new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... strings) {
return HttpUtils.getStringFromHttp(strings[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (isLoadMore) {
xlvNews.stopLoadMore();
} else {
xlvNews.stopRefresh();
}
}
}, 200);
Gson gson = new Gson();
News news = gson.fromJson(s, News.class);
if (news != null) {
List<News.DataBean> data = news.getData();
if (data != null) {
if (!isLoadMore) {
list.clear();
}
list.addAll(data);
adapter.notifyDataSetChanged();
dao.insert(list);
}
}
}
}.execute(url);
}
}
public class MainActivity extends BaseActivity implements View.OnClickListener {
private ViewPager vpSplash;
private List<Integer> imgIds;
private Button btnGotoMain;
private SharedPreferences sp;
@Override
protected int getContentView() {
return R.layout.activity_main;
}
@Override
protected void initView() {
vpSplash = findViewById(R.id.vp_splash);
btnGotoMain = findViewById(R.id.btn_goto_main);
}
@Override
protected void initData() {
super.initData();
sp = getSharedPreferences("config", MODE_PRIVATE);
if (!sp.getBoolean("is_first", true)) {
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
finish();
return;
}
imgIds = new ArrayList<>();
imgIds.add(R.drawable.a1);
imgIds.add(R.drawable.a2);
imgIds.add(R.drawable.a3);
vpSplash.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return imgIds.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
ImageView img = new ImageView(mContext);
img.setImageResource(imgIds.get(position));
container.addView(img);
return img;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
});
}
@Override
protected void setListener() {
super.setListener();
vpSplash.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (position == imgIds.size() - 1) {
btnGotoMain.setVisibility(View.VISIBLE);
} else {
btnGotoMain.setVisibility(View.GONE);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
btnGotoMain.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_goto_main:
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
break;
}
}
}
public class LoginActivity extends BaseActivity implements View.OnClickListener {
public static final int FLAG = 123;
private EditText etUsername;
private EditText etPassword;
private Button btnLogin;
private SharedPreferences sp;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case FLAG:
String result = (String) msg.obj;
Gson gson = new Gson();
LoginResult loginResult = gson.fromJson(result, LoginResult.class);
if (loginResult != null) {
if (loginResult.getCode() == 0) {
sp.edit().putBoolean("is_first", false).commit();
Intent intent = new Intent(mContext, HomeActivity.class);
startActivity(intent);
}
}
break;
}
}
};
@Override
protected int getContentView() {
return R.layout.activity_login;
}
@Override
protected void initView() {
etUsername = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
btnLogin = findViewById(R.id.btn_login);
}
@Override
protected void initData() {
super.initData();
sp = getSharedPreferences("config", MODE_PRIVATE);
}
@Override
protected void setListener() {
super.setListener();
btnLogin.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_login:
final String username = etUsername.getText().toString().trim();
final String password = etPassword.getText().toString();
// if (username.equals())
new Thread(new Runnable() {
@Override
public void run() {
String url = ServerUrl.LOGIN_URL + "mobile=" + username + "&password=" + password;
String result = HttpUtils.getStringFromHttp(url);
Message msg = Message.obtain();
msg.what = FLAG;
msg.obj = result;
handler.sendMessage(msg);
}
}).start();
break;
}
}
}
public class HomeActivity extends BaseActivity {
private TabLayout tblNews;
private ViewPager vpNews;
private List<String> titles;
private List<Fragment> fragmentList;
@Override
protected int getContentView() {
return R.layout.activity_home;
}
@Override
protected void initView() {
tblNews = findViewById(R.id.tbl_news);
vpNews = findViewById(R.id.vp_news);
}
@Override
protected void initData() {
super.initData();
titles = new ArrayList<>();
tblNews.setTabMode(TabLayout.MODE_SCROLLABLE);
addData();
fragmentList = new ArrayList<>();
fragmentList.add(new NewsFragment());
for (int i = 1; i < titles.size(); i++) {
EmptyFragment fragment = EmptyFragment.newInstance(titles.get(i));
fragmentList.add(fragment);
}
vpNews.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
});
tblNews.setupWithViewPager(vpNews);
}
private void addData() {
titles.add("关注");
titles.add("热门");
titles.add("新闻");
titles.add("影视");
titles.add("段子");
titles.add("教育");
titles.add("房产");
titles.add("汽车");
titles.add("政治");
}
}