Listview展示数据(有网则网络请求数据*没有网则数据库获取数据)

效果图在这里插入图片描述


主布局

<?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>



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值