一、布局:
1.1、activity_main.xml布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/drawerLayout"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/tabLayout"
app:tabGravity="fill"></android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="9"
android:id="@+id/viewPager"></android.support.v4.view.ViewPager>
</LinearLayout>
<LinearLayout
android:layout_width="400dp"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="left"
android:background="#ccc"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="个人主页"
android:textSize="25sp"
android:layout_marginTop="30dp"
android:padding="10dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="姓名:大壮"
android:textSize="25sp"
android:layout_marginTop="30dp"
android:padding="10dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="年龄:26"
android:textSize="25sp"
android:layout_marginTop="30dp"
android:padding="10dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="公司:百度"
android:textSize="25sp"
android:layout_marginTop="30dp"
android:padding="10dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="职位:软件工程师"
android:textSize="25sp"
android:layout_marginTop="30dp"
android:padding="10dp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="退出"
android:id="@+id/btn_close"
android:layout_marginTop="30dp"
/>
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
1.2、list优化listview1:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text01"
android:padding="10dp"
android:textSize="25sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="哈哈" />
<TextView
android:id="@+id/text02"
android:padding="10dp"
android:textSize="25sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="哈哈" />
</LinearLayout>
1.3、listview2布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/images"
android:src="@mipmap/ic_launcher"
android:padding="10dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈"
android:textSize="20sp"
android:padding="10dp"
android:id="@+id/text001"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈"
android:textSize="20sp"
android:padding="10dp"
android:id="@+id/text002"/>
</LinearLayout>
</LinearLayout>
1.4、listview3布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/images01"
android:src="@mipmap/ic_launcher"
android:padding="10dp"/>
</LinearLayout>
1.5、fragment布局:1.5.1、my_fragment 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:background="#0f0"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
1.5.2、news_fragment布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:background="#00f"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
1.5.3、shouye_ fragment布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:background="#f00"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<com.qy.xlistview.XListView
android:id="@+id/xlistView"
android:layout_width="match_parent"
android:layout_height="wrap_content"></com.qy.xlistview.XListView>
</LinearLayout>
二、主方法:
2.1、MAinActivity代码:
package com.baway.qizhuangzhuang20170926;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import com.baway.qizhuangzhuang20170926.adapter.MyFragmentAdapter;
import com.baway.qizhuangzhuang20170926.fragment.MyFragment;
import com.baway.qizhuangzhuang20170926.fragment.NewsFragment;
import com.baway.qizhuangzhuang20170926.fragment.ShouYeFragment;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends FragmentActivity {
private DrawerLayout drawerLayout;
private Button btn_close;
private TabLayout tabLayout;
private ViewPager viewPager;
private List<Fragment> list;
private String[] titles={"首页","新闻","我的"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_close = findViewById(R.id.btn_close);
drawerLayout = findViewById(R.id.drawerLayout);
tabLayout = findViewById(R.id.tabLayout);
viewPager = findViewById(R.id.viewPager);
btn_close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
drawerLayout.closeDrawer(Gravity.LEFT);
}
});
list = new ArrayList<Fragment>();
list.add(new ShouYeFragment());
list.add(new NewsFragment());
list.add(new MyFragment());
//创建适配器
MyFragmentAdapter adapter = new MyFragmentAdapter(getSupportFragmentManager(), list, titles);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
}
}
2.2、MainActivity的适配器:
package com.baway.qizhuangzhuang20170926.adapter;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
/**
* @Auther: lenovo
* @Date: 2019/2/25 10:58:00
* @Description:
*/
public class MyFragmentAdapter extends FragmentPagerAdapter {
private List<Fragment> list;
private String[] titles;
public MyFragmentAdapter(FragmentManager fm, List<Fragment> list, String[] titles) {
super(fm);
this.list = list;
this.titles = titles;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
@Override
public Fragment getItem(int i) {
return list.get(i);
}
@Override
public int getCount() {
return list.size();
}
}
2.3、数据库代码:
package com.baway.qizhuangzhuang20170926.helper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* @Auther: lenovo
* @Date: 2019/2/25 10:59:09
* @Description:
*/
public class MyHelper extends SQLiteOpenHelper{
public MyHelper(Context contextable){
super(contextable,"bw.db",null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table news(url varchar(100),json varchar(500))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2.4、数据库dao层代码:
package com.baway.qizhuangzhuang20170926.dao;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.baway.qizhuangzhuang20170926.helper.MyHelper;
/**
* @Auther: lenovo
* @Date: 2019/2/25 10:58:34
* @Description:
*/
public class SqlDao {
private MyHelper myHelper;
private String table="news";
public SqlDao(Context context){
myHelper = new MyHelper(context);
}
//添加数据库
public void insertData(String dataUrl, String jsonStr){
SQLiteDatabase database = myHelper.getWritableDatabase();
//先删除数据
database.delete(table,"url=?",new String[]{dataUrl});
ContentValues values =new ContentValues();
values.put("url",dataUrl);
values.put("json",jsonStr);
database.insert(table,null,values);
}
//查询数据库
public String selectData(String dataUrl){
String json="";
SQLiteDatabase database = myHelper.getWritableDatabase();
Cursor cursor = database.query(table,null,"url=?",new String[]{dataUrl},null,null,null);
while (cursor.moveToNext()){
json = cursor.getString(cursor.getColumnIndex("json"));
}
return json;
}
}
2.5、 util网络请求:
2.5.1、HttpUtil代码:
package com.baway.qizhuangzhuang20170926.util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @Auther: lenovo
* @Date: 2019/2/25 10:32:17
* @Description:
*/
public class HttpUtil {
public static String getNetData(String dataUrl){
try{
URL url =new URL(dataUrl);
HttpURLConnection connection =(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int code = connection.getResponseCode();
if (code==200){
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder builder = new StringBuilder();
String str="";
while ((str=reader.readLine())!=null){
builder.append(str);
}
return builder.toString();
}
}catch (Exception e){
e.printStackTrace();
}
return "";
}
}
2.5.2、NetUtil代码:
package com.baway.qizhuangzhuang20170926.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* @Auther: lenovo
* @Date: 2019/2/25 10:32:48
* @Description:
*/
public class NetUtil {
public boolean isNetConnected(Context context){
try{
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info !=null){
return info.isAvailable();
}
}catch (Exception e){
e.printStackTrace();
}
return false;
}
}
2.6、bean类news和newsbean;
2.6.1、news类代码:
package com.baway.qizhuangzhuang20170926.bean;
/**
* @Auther: lenovo
* @Date: 2019/2/25 10:56:43
* @Description:
*/
public class News {
private String news_title;
private String news_summary;
private String pic_url;
public News(String news_title, String news_summary, String pic_url) {
this.news_title = news_title;
this.news_summary = news_summary;
this.pic_url = pic_url;
}
public String getNews_title() {
return news_title;
}
public void setNews_title(String news_title) {
this.news_title = news_title;
}
public String getNews_summary() {
return news_summary;
}
public void setNews_summary(String news_summary) {
this.news_summary = news_summary;
}
public String getPic_url() {
return pic_url;
}
public void setPic_url(String pic_url) {
this.pic_url = pic_url;
}
@Override
public String toString() {
return "News{" +
"news_title='" + news_title + '\'' +
", news_summary='" + news_summary + '\'' +
", pic_url='" + pic_url + '\'' +
'}';
}
}
2.6.2、newsbean代码:
package com.baway.qizhuangzhuang20170926.bean;
import java.util.List;
/**
* @Auther: lenovo
* @Date: 2019/2/25 10:56:56
* @Description:
*/
public class NewsBean {
private List<News> data;
public NewsBean(List<News> data) {
this.data = data;
}
public List<News> getData() {
return data;
}
public void setData(List<News> data) {
this.data = data;
}
@Override
public String toString() {
return "NewsBean{" +
"data=" + data +
'}';
}
}
2.7、fragment首页解析数据代码:
package com.baway.qizhuangzhuang20170926.fragment;
import android.media.DrmInitData;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.baway.qizhuangzhuang20170926.R;
import com.baway.qizhuangzhuang20170926.adapter.MyBaseAdapter;
import com.baway.qizhuangzhuang20170926.bean.News;
import com.baway.qizhuangzhuang20170926.bean.NewsBean;
import com.baway.qizhuangzhuang20170926.dao.SqlDao;
import com.baway.qizhuangzhuang20170926.util.HttpUtil;
import com.baway.qizhuangzhuang20170926.util.NetUtil;
import com.google.gson.Gson;
import com.qy.xlistview.XListView;
import java.util.ArrayList;
import java.util.List;
/**
* @Auther: lenovo
* @Date: 2019/2/25 10:56:16
* @Description:
*/
public class ShouYeFragment extends Fragment {
private String dataUrl="http://api.expoon.com/AppNews/getNewsList/type/1/p/";
private XListView xListView;
private List<News> list=new ArrayList<News>();
private int page=1;
private MyBaseAdapter adapter;
private boolean netConnected;
private SqlDao dao;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.shouye_fragment,container,false);
xListView = view.findViewById(R.id.xlistView);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dao = new SqlDao(getActivity());
NetUtil util = new NetUtil();
netConnected = util.isNetConnected(getActivity());
adapter = new MyBaseAdapter(list, getActivity());
xListView.setAdapter(adapter);
initData(page);
xListView.setPullLoadEnable(true);
xListView.setPullRefreshEnable(true);
xListView.setXListViewListener(new XListView.IXListViewListener() {
@Override
public void onRefresh() {
initData(page);
}
@Override
public void onLoadMore() {
page++;
initData(page);
}
});
}
private void initData(int page){
if (netConnected){
new MyAsnycTask().execute(dataUrl+page);
}else {
Toast.makeText(getActivity(), "无网", Toast.LENGTH_SHORT).show();
String selectData = dao.selectData(dataUrl + page);
jsonParse(selectData);
}
}
private void jsonParse(String s){
Gson gson = new Gson();
NewsBean newsBean = gson.fromJson(s, NewsBean.class);
List<News> data = newsBean.getData();
list.addAll(data);
adapter.notifyDataSetChanged();
}
//创建内部类
public class MyAsnycTask extends AsyncTask<String,Void,String>{
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.i("aaa",""+s);
dao.insertData(dataUrl+page,s);
jsonParse(s);
stopLoad();
}
@Override
protected String doInBackground(String... strings) {
String data =HttpUtil.getNetData(strings[0]);
return data;
}
}
private void stopLoad(){
xListView.setRefreshTime("刚刚刷新");
xListView.stopLoadMore();
xListView.stopRefresh();
}
}
2.8、MyBaseAdapter适配器代码:
package com.baway.qizhuangzhuang20170926.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.baway.qizhuangzhuang20170926.R;
import com.baway.qizhuangzhuang20170926.bean.News;
import com.bumptech.glide.Glide;
import java.util.List;
/**
* @Auther: lenovo
* @Date: 2019/2/25 10:57:37
* @Description:
*/
public class MyBaseAdapter extends BaseAdapter {
private List<News> list;
private Context context;
public MyBaseAdapter(List<News> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getItemViewType(int position) {
return position%3;
}
@Override
public int getViewTypeCount() {
return 3;
}
@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) {
switch (getItemViewType(position)){
case 0:
ViewHolder1 holder1;
if (convertView==null){
convertView=View.inflate(context, R.layout.listview1,null);
holder1 = new ViewHolder1();
holder1.textView1 = convertView.findViewById(R.id.text01);
holder1.textView2 = convertView.findViewById(R.id.text02);
convertView.setTag(holder1);
}else {
holder1=(ViewHolder1)convertView.getTag();
}
holder1.textView1.setText(list.get(position).getNews_title());
holder1.textView2.setText(list.get(position).getNews_summary());
break;
case 1:
ViewHolder2 holder2;
if (convertView==null){
convertView = View.inflate(context,R.layout.listview2,null);
holder2 = new ViewHolder2();
holder2.textView3=convertView.findViewById(R.id.text001);
holder2.textView4=convertView.findViewById(R.id.text002);
holder2.imageView=convertView.findViewById(R.id.images);
convertView.setTag(holder2);
}else {
holder2=(ViewHolder2)convertView.getTag();
}
holder2.textView3.setText(list.get(position).getNews_title());
holder2.textView4.setText(list.get(position).getNews_summary());
Glide.with(context).load(list.get(position).getPic_url()).into(holder2.imageView);
break;
case 2:
ViewHolder3 holder3;
if (convertView==null){
convertView=View.inflate(context,R.layout.listview3,null);
holder3=new ViewHolder3();
holder3.imageView1=convertView.findViewById(R.id.images01);
convertView.setTag(holder3);
}else {
holder3=(ViewHolder3)convertView.getTag();
}
Glide.with(context).load(list.get(position).getPic_url()).into(holder3.imageView1);
break;
}
return convertView;
}
class ViewHolder1{
private TextView textView1,textView2;
}
class ViewHolder2{
private ImageView imageView;
private TextView textView3,textView4;
}
class ViewHolder3{
private ImageView imageView1;
}
}
2.9、最后一定的记住写:网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
2.10、写依赖:
xlistview依赖;design包;glide包;gson包.
implementation project(':xlistview_library')
implementation 'com.android.support:design:28.0.0'
implementation 'com.github.bumptech.glide:glide:4.9.0'
implementation 'com.google.code.gson:gson:2.8.5'