效果图
主布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".activity.MainActivity"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="80dp" />
</LinearLayout>
mainactivity
package com.example.lianxizhoukao1.activity;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.lianxizhoukao1.adapter.MyAdapter;
import com.example.lianxizhoukao1.R;
public class MainActivity extends AppCompatActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
//获取资源id
tabLayout =findViewById( R.id.tabLayout );
viewPager =findViewById( R.id.viewpager );
//创建tablayout适配器*互相绑定切换页面
viewPager.setAdapter( new MyAdapter(getSupportFragmentManager()) );
tabLayout.setupWithViewPager( viewPager );
}
}
tablayout适配器
package com.example.lianxizhoukao1.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 com.example.lianxizhoukao1.fragment.AFragment;
import com.example.lianxizhoukao1.fragment.BFragment;
import com.example.lianxizhoukao1.fragment.CFragment;
public class MyAdapter extends FragmentPagerAdapter {
//设置一个数组标题数据
private String[] s = new String[]{"頁面1","頁面2","頁面3"};
public MyAdapter(FragmentManager fm) {
super( fm );
}
//获取数据长度
@Override
public int getCount() {
return s.length;
}
//切换界面
@Override
public Fragment getItem(int i) {
switch (i){
case 0:
return new AFragment();
case 1:
return new BFragment();
case 2:
return new CFragment();
default:
return new Fragment();
}
}
//设置标题
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return s[position];
}
}
第一个fragment页面只展示一个listview
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f00">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</android.support.constraint.ConstraintLayout>
Listview子布局
<?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"
android:orientation="horizontal">
<LinearLayout
android:layout_weight="1"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="150dp">
<TextView
android:id="@+id/text1"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/text2"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<ImageView
android:id="@+id/image1"
android:layout_width="150dp"
android:layout_height="150dp"
android:src="@mipmap/ic_launcher"/>
</LinearLayout>
其他页面暂时放空不展示数据
Fragment第一个页面做的逻辑代码
package com.example.lianxizhoukao1.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.example.lianxizhoukao1.adapter.MyBase;
import com.example.lianxizhoukao1.R;
import com.example.lianxizhoukao1.bean.Bean;
import com.example.lianxizhoukao1.sqlite.Dao;
import com.example.lianxizhoukao1.uitl.NewUitl;
import java.util.List;
public class AFragment extends Fragment {
private ListView listView;
private MyBase myBase;
private Dao dao;
private String uri="http://api.expoon.com/AppNews/getNewsList/type/1/p/1";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
dao = new Dao( getActivity() );
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate( R.layout.item,container,false );
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
//获取资源id
listView = view.findViewById( R.id.listview );
//创建适配器
myBase = new MyBase( getActivity() );
//设置适配器
listView.setAdapter( myBase );
//长按监听事件
longdianji();
//判断网络*加载数据
wangluo();
}
//长按删除
private void longdianji() {
listView.setOnItemLongClickListener( new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
dao.shan(myBase.getItem( position ).getNews_id());
myBase.shachu(position);
Toast.makeText( getActivity(),"删除当前条目"+position,Toast.LENGTH_SHORT ).show();
return true;
}
} );
}
//判断网络*加载数据
private void wangluo() {
//工具类中的方法
boolean b = NewUitl.getNewUitl().hasNetwork( getActivity() );
//判断是否有网络
if (b){//有
Toast.makeText( getActivity(),"加载网络数据",Toast.LENGTH_SHORT ).show();
initData();
}else {//没有
Toast.makeText( getActivity(),"当前无网路",Toast.LENGTH_SHORT ).show();
List<Bean.DataBean> cha = dao.cha();
if (cha!=null){
myBase.setList( cha );
Toast.makeText( getActivity(),"展示的是数据库数据",Toast.LENGTH_SHORT ).show();
}
Toast.makeText( getActivity(),"数据库无数据",Toast.LENGTH_SHORT ).show();
}
}
//网络加载数据
private void initData() {
//工具类中的方法
NewUitl.getNewUitl().getRequset( uri, Bean.class, new NewUitl.CallBak<Bean>() {
@Override
public void onsuccess(Bean bean) {
dao.add(bean.getData());
myBase.setList( bean.getData() );
}
} );
}
}
Listview适配器
package com.example.lianxizhoukao1.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.lianxizhoukao1.R;
import com.example.lianxizhoukao1.bean.Bean;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import java.util.List;
public class MyBase extends BaseAdapter {
private List<Bean.DataBean> list;
private Context context;
public MyBase(Context context) {
this.context = context;
list = new ArrayList<>( );
}
//设置数据
public void setList(List<Bean.DataBean> list) {
this.list = list;
notifyDataSetChanged();
}
//删除数据
public void shachu(int position) {
list.remove( position );
notifyDataSetChanged();
}
@Override
public int getCount() {
return list.size();
}
@Override
public Bean.DataBean 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) {
ViewHolder holder;
if (convertView==null) {
convertView = LayoutInflater.from( context ).inflate( R.layout.zi1,parent,false );
holder = new ViewHolder(convertView);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.setData(getItem( position ));
return convertView;
}
//寄存器
class ViewHolder{
TextView textView1;
TextView textView2;
ImageView imageView;
public ViewHolder(View convertView) {
textView1 = convertView.findViewById( R.id.text1 );
textView2 = convertView.findViewById( R.id.text2 );
imageView = convertView.findViewById( R.id.image1 );
convertView.setTag( this );
}
public void setData(Bean.DataBean item) {
textView1.setText( item.getNews_title() );
textView2.setText( item.getNews_summary() );
ImageLoader.getInstance().displayImage( item.getPic_url(),imageView );
}
}
}
工具类请求数据
package com.example.lianxizhoukao1.uitl;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import com.example.lianxizhoukao1.bean.Bean;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class NewUitl {
/*单例模式*/
private static NewUitl newUitl;
private NewUitl(){
}
/*只实例化一次*/
public static NewUitl getNewUitl(){
if (newUitl==null){
newUitl = new NewUitl();
}
return newUitl;
}
/*实心一个接口*/
public interface CallBak<T>{
void onsuccess(T t);
}
/*asyncTask异步加载*/
public void getRequset(String s, final Class clazz, final CallBak callBak ){
new AsyncTask<String, Void, Object>() {
@Override
protected Object doInBackground(String... strings) {
return getRequset( strings[0],clazz );
}
@Override
protected void onPostExecute(Object o) {
callBak.onsuccess( o );
}
}.execute( s );
}
/*gson解析数据*/
private <T>T getRequset(String string, Class clazz) {
return (T) new Gson().fromJson( getRequset( string ),Bean.class );
}
/*uri地址*/
private String strUrl ="http://api.expoon.com/AppNews/getNewsList/type/1/p/1";
/*http请求数据*/
private String getRequset(String string) {
try {
URL url= new URL( strUrl );
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setReadTimeout( 3000 );
urlConnection.setConnectTimeout( 3000 );
if (urlConnection.getResponseCode()==200){
String s = strean2String( urlConnection.getInputStream() );
return s;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/*数据流解析*/
private String strean2String(InputStream inputStream) throws IOException {
StringBuilder sb = new StringBuilder( );
BufferedReader br = new BufferedReader( new InputStreamReader( inputStream ) );
for (String tmp = br.readLine(); tmp !=null;tmp= br.readLine()){
sb.append( tmp );
}
return sb.toString();
}
/*判断网络状态*/
public boolean hasNetwork(Context context){
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetworkInfo==null||!activeNetworkInfo.isAvailable()){
return false;
}
return true;
}
}
Bean类接收数据
package com.example.lianxizhoukao1.bean;
import java.util.List;
public class Bean {
private int status;
private String info;
private List<DataBean> data;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
private String news_id;
private String news_title;
private String news_summary;
private String pic_url;
public DataBean(String news_id, String news_title, String news_summary, String pic_url) {
this.news_id = news_id;
this.news_title = news_title;
this.news_summary = news_summary;
this.pic_url = pic_url;
}
public String getNews_id() {
return news_id;
}
public void setNews_id(String news_id) {
this.news_id = news_id;
}
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;
}
}
}
创建数据库
package com.example.lianxizhoukao1.sqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class SQLHelper extends SQLiteOpenHelper {
public SQLHelper(Context context) {
super( context, "User.db", null, 1 );
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table data(id integer primary key autoincrement," +
"title text," +
"summary text," +
"image_url text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
Dao层做逻辑操作
package com.example.lianxizhoukao1.sqlite;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.lianxizhoukao1.bean.Bean;
import java.util.ArrayList;
import java.util.List;
public class Dao {
private SQLiteDatabase sb;
private SQLHelper helper;
public Dao (Context context){
helper = new SQLHelper( context );
sb = helper.getWritableDatabase();
}
//添加数据
public void add(List<Bean.DataBean> data) {
for (Bean.DataBean dataBean : data){
ContentValues values = new ContentValues( );
values.put( "id",dataBean.getNews_id() );
values.put( "title",dataBean.getNews_title() );
values.put( "summary",dataBean.getNews_summary() );
values.put( "image_url",dataBean.getPic_url() );
sb.insert( "data",null,values );
}
}
//查询数据
public List<Bean.DataBean> cha() {
List<Bean.DataBean> list = new ArrayList<>( );
Cursor data = sb.query( "data", null, null, null, null, null, null );
if (data!=null){
while (data.moveToNext()){
String id = data.getString( data.getColumnIndex( "id" ) );
String title = data.getString( data.getColumnIndex( "title" ) );
String summary = data.getString( data.getColumnIndex( "summary" ) );
String image_url = data.getString( data.getColumnIndex( "image_url" ) );
list.add( new Bean.DataBean(id,title,summary,image_url) );
}
data.close();
}
return list;
}
//删除数据
public void shan(String news_id) {
sb.delete( "data","id=?",new String[]{news_id} );
}
}
App全局配置
package com.example.lianxizhoukao1.uitl;
import android.app.Application;
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
//imageloader加载图片全局配置
ImageLoader.getInstance().init( new ImageLoaderConfiguration.Builder( this )
.memoryCacheSizePercentage( 10 )
//设计缓存大小
.diskCacheSize( 20*1024*1024 )
.defaultDisplayImageOptions( new DisplayImageOptions.Builder()
/*设置色彩模式*/
.bitmapConfig( Bitmap.Config.RGB_565 )
/*设置允许缓存*/
.cacheOnDisk( true )
.cacheInMemory( true )
/*圆形*/
.displayer( new CircleBitmapDisplayer( ) )
/*圆角*/
//.displayer(new RoundedBitmapDisplayer( 30 ) )
.build() )
.build() );
}
}
如果全部都打完了还不出效果,那就恭喜你没加权限 还要app也要记得name一下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lianxizhoukao1">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:name=".uitl.App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>