PullToRefreshListView上下拉 +Handler轮播图 ++Image-Loader圆形图片+TabLayout+ViewPager+数据库增查操作

嗨,大家好
今天为大家整理了我以前学过的知识点:
PullToRefreshListView上下拉 +Handler轮播图 ++Image-Loader圆形图片+TabLayout+ViewPager+数据库增查操作,初入android 还请各位大神多多指点留言。

这是效果图:
在这里插入图片描述如图上所展示 上方是一个用handler写的轮播图,而下方是我关联了一个PullToReFresh Library写的PullToReFreshListView上下拉刷新列表,底部是RadioGroup ,点击每个RadioButton就可以跳转各个全新Fragment,顶部是第一个Fragment里的TabLayout布局
,PullToReFreshListView是我找的一个借口从网上用Gson解析的数据,解析完直接添加到数据库。

在这里插入图片描述

此图虽然有点乱,但只是我练习时,也无所谓,这是我用TextView控件查询出来的数据里的数据,如果各位大神觉得乱,可以把这个当做数据源,放到自己想要的布局上。接下来就是代码展示了。

这是需要导入的依赖:

implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
implementation 'com.android.support:design:28.0.0'

这是需要添加的权限:

<uses-permission android:name="android.permission.INTERNET"/><!--获取网络权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--获取SD卡写入权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><!--获取SD卡读取权限-->

这是activity.xml里的代码:

这里写了RadioGroup和一个FrameLayout动态添加Fragment

<?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"
    tools:context=".MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:id="@+id/rg"
            android:orientation="horizontal"
            >
            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="文章"
                android:button="@null"
                android:gravity="center"
                android:id="@+id/rb1"
                android:background="@drawable/sel"
                android:checked="true"/>
            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="站点"
                android:button="@null"
                android:gravity="center"
                android:id="@+id/rb2"
                android:background="@drawable/sel"/>


            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="主题"
                android:button="@null"
                android:gravity="center"
                android:id="@+id/rb3"
                android:background="@drawable/sel"/>


            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="发现"
                android:button="@null"
                android:gravity="center"
                android:id="@+id/rb4"
                android:background="@drawable/sel"/>


            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="我的"
                android:button="@null"
                android:gravity="center"
                android:id="@+id/rb5"
                android:background="@drawable/sel"/>
        </RadioGroup>
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/frg"
            android:layout_above="@id/rg"></FrameLayout>
    </RelativeLayout>

</android.support.v4.widget.DrawerLayout>

写完这些我们先完善底部RadioGroup 的RadioButton切换各个Fragment

我的MainActivity:

package com.example.a51044.week3;

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.widget.FrameLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import com.example.a51044.week3.fragment.Fragment1;
import com.example.a51044.week3.fragment.Fragment2;
import com.example.a51044.week3.fragment.Fragment3;
import com.example.a51044.week3.fragment.Fragment4;
import com.example.a51044.week3.fragment.Fragment5;

public class MainActivity extends AppCompatActivity {

    private RadioButton rb1;
    private RadioButton rb2;
    private RadioButton rb3;
    private RadioButton rb4;
    private RadioButton rb5;
    private RadioGroup rg;
    private FrameLayout frg;
    private FragmentManager manager;
    private Fragment1 frg1;
    private Fragment2 frg2;
    private Fragment3 frg3;
    private Fragment4 frg4;
    private Fragment5 frg5;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
        //默认进入第一个Fragment
        manager.beginTransaction().replace(R.id.frg,frg1).commit();
        //RadioGroup的监听事件
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId)
                {
                    case R.id.rb1:
                        manager.beginTransaction().replace(R.id.frg,frg1).commit();
                    break;

                    case R.id.rb2:
                        manager.beginTransaction().replace(R.id.frg,frg2).commit();
                        break;

                    case R.id.rb3:
                        manager.beginTransaction().replace(R.id.frg,frg3).commit();
                        break;

                    case R.id.rb4:
                        manager.beginTransaction().replace(R.id.frg,frg4).commit();
                        break;

                    case R.id.rb5:
                        manager.beginTransaction().replace(R.id.frg,frg5).commit();
                        break;



                }
            }
        });
    }

    private void initData() {
        frg1=new Fragment1();
        frg2=new Fragment2();
        frg3=new Fragment3();
        frg4=new Fragment4();
        frg5=new Fragment5();
    }

    private void initView() {
        rb1 = (RadioButton) findViewById(R.id.rb1);
        rb2 = (RadioButton) findViewById(R.id.rb2);
        rb3 = (RadioButton) findViewById(R.id.rb3);
        rb4 = (RadioButton) findViewById(R.id.rb4);
        rb5 = (RadioButton) findViewById(R.id.rb5);
        rg = (RadioGroup) findViewById(R.id.rg);
        frg = (FrameLayout) findViewById(R.id.frg);
        //获取Fragment管理类
        manager=getSupportFragmentManager();
    }
}

接下来写默认进入的第一个Fragment:

package com.example.a51044.week3.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.a51044.week3.Adapter.MyPagerAdapter;
import com.example.a51044.week3.R;
import com.example.a51044.week3.fragment1.FragmentA;
import com.example.a51044.week3.fragment1.FragmentB;
import com.example.a51044.week3.fragment1.FragmentC;
import com.example.a51044.week3.fragment1.FragmentD;

import java.util.ArrayList;
import java.util.List;

public class Fragment1 extends Fragment {
    private View view;
    private TabLayout Tab_Layout;
    private ViewPager vp;

    private FragmentA fragment1;
    private FragmentB fragment2;
    private FragmentC fragment3;
    private FragmentD fragment4;

    private List<Fragment>mList;
    private List<String>mTitle;

    private MyPagerAdapter myPagerAdapter;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.draw_pager, null);
        initData();//添加数据
        initView(view);//查找控件
        //Fragment嵌套getChildFragmentManager()
        myPagerAdapter=new MyPagerAdapter(getChildFragmentManager(),mList,mTitle);
        vp.setAdapter(myPagerAdapter);
        return view;
    }

    private void initData() {
        fragment1=new FragmentA();
        fragment2=new FragmentB();
        fragment3=new FragmentC();
        fragment4=new FragmentD();
        mList=new ArrayList<>();
        mTitle=new ArrayList<>();
        mList.add(fragment1);
        mList.add(fragment2);
        mList.add(fragment3);
        mList.add(fragment4);
        mTitle.add("推荐");
        mTitle.add("热门");
        mTitle.add("科技");
        mTitle.add("创股");
    }

    private void initView(View view) {
        Tab_Layout = (TabLayout) view.findViewById(R.id.Tab_Layout);
        vp = (ViewPager) view.findViewById(R.id.vp);
        Tab_Layout.setupWithViewPager(vp);//TabLayout和ViewPager交互
    }
}

第一个Fragment需要的xml布局文件:
我用的RelativeLayout布局上边是TabLayout,底下是一个ViewPager

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">\

    <android.support.design.widget.TabLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Tab_Layout"></android.support.design.widget.TabLayout>


    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/vp"
        android:layout_below="@id/Tab_Layout"></android.support.v4.view.ViewPager>
</RelativeLayout>

写完第一个Fragment ,进入到第一个子Fragment中:

这里也是这次练习中代码最多的页面了

package com.example.a51044.week3.fragment1;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import com.example.a51044.week3.Adapter.MyListAdapter;
import com.example.a51044.week3.Adapter.MyLunboAdapter;
import com.example.a51044.week3.Daoceng.Dao;
import com.example.a51044.week3.R;
import com.example.a51044.week3.bean.Databases;
import com.example.a51044.week3.bean.MyData;
import com.example.pulltolibrary.PullToRefreshBase;
import com.example.pulltolibrary.PullToRefreshListView;
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;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

public class FragmentA extends Fragment {
    private View view;
    private ViewPager lunbo_vp;
    private PullToRefreshListView pull_to_refresh_view;
    private int index=0;
    private List<View>mList=new ArrayList<>();//存放布局文件的集合
    private Context mContext;
    private int v=1;//拼接  ,接口让接口的数据发生变化
    private Dao dao;//调用数据库的Dao层 实现增删改查
    private Handler myHandler=new Handler()//控制轮播图的handler
    {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(index==mList.size())//判断是否循环到最后一张,重新循环轮播图
            {
                index=0;
                
            }
            else
            {
                index++;
                lunbo_vp.setCurrentItem(index);
                
            }
		sendEmptyMessageDelayed(0,1000);//每隔1秒更新一次主线程


        }
    };

    private MyLunboAdapter myLunboAdapter;//轮播图适配器
    private String mUrl="http://api.expoon.com/AppNews/getNewsList/type/1/p/1";
    private MyListAdapter myListAdapter;//列表适配器
    private List<MyData.DataBean>mData=new ArrayList<>();

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.lunbo, null);

        mContext=getActivity().getApplicationContext();
        dao=new Dao(mContext);
        initData();
        initView(view);
        myLunboAdapter=new MyLunboAdapter(mList);
        lunbo_vp.setAdapter(myLunboAdapter);
        myListAdapter=new MyListAdapter(mData,mContext);
        pull_to_refresh_view.setAdapter(myListAdapter);
        new MyTask().execute(mUrl+v);//异步解析
        myHandler.sendEmptyMessageDelayed(0,1000);//给handler发送消息
        

        return view;
    }



    private void initData() {//轮播图用到的图片
        mList.add(View.inflate(mContext,R.layout.page1,null));
        mList.add(View.inflate(mContext,R.layout.page2,null));
        mList.add(View.inflate(mContext,R.layout.page3,null));
        mList.add(View.inflate(mContext,R.layout.page4,null));
    }

    private void initView(View view) {
        lunbo_vp = (ViewPager) view.findViewById(R.id.lunbo_vp);
       
        pull_to_refresh_view = (PullToRefreshListView) view.findViewById(R.id.pull_to_refresh_view);
         //设置上下拉的权限
        pull_to_refresh_view.setMode(PullToRefreshBase.Mode.BOTH);
        //PullToRefreshListView的监听事件
        pull_to_refresh_view.setOnRefreshListener(new 
	
        PullToRefreshBase.OnRefreshListener2<ListView>() {
        //下拉刷新
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
            	//清楚集合数据,重新解析
                mData.clear();
                new MyTask().execute(mUrl+v);
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
            上拉加载更多数据,v++是为了加载不同的数据
            
                v++;
                new MyTask().execute(mUrl+v);
            }
        });
    }

//异步  用Gson解析数据
    class MyTask extends AsyncTask<String,Void,List<MyData.DataBean>>
    {

        @Override
        protected List<MyData.DataBean> doInBackground(String... strings) {
            try {
                URL url=new URL(strings[0]);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                InputStream inputStream = urlConnection.getInputStream();
                String str=getStr(inputStream);//读取成字符串
                Gson gson=new Gson();
                MyData data = gson.fromJson(str, MyData.class);
                return data.getData();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        private String getStr(InputStream inputStream) throws IOException {
            BufferedReader read=new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer sb=new StringBuffer();
            String con="";
            while ((con=read.readLine())!=null)
            {
                sb.append(con);
            }
            return sb.toString();
        }

//解析完成
        @Override
        protected void onPostExecute(List<MyData.DataBean> dataBeans) {
            super.onPostExecute(dataBeans);
            //把数据添加到集合中
            mData.addAll(dataBeans);
            //刷新适配器
            myListAdapter.notifyDataSetChanged();
            //PullToRefresh的停止刷新办法
            pull_to_refresh_view.onRefreshComplete();
            //调用dao层方法把解析出来的数据添加到数据库
            dao.addSql(mData);
        }
    }
}

上面需要的xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/lunbo_vp"
        ></android.support.v4.view.ViewPager>

    <com.example.pulltolibrary.PullToRefreshListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/pull_to_refresh_view"
        android:layout_below="@id/lunbo_vp"></com.example.pulltolibrary.PullToRefreshListView>
</RelativeLayout>

注:上面的轮播图使用的布局,可以新建一个xml,在最大的布局里写一个Background,加上自己喜欢的图片就可以了。

这是第二个子Fragment:里面写了查询数据库的方法,我用TextView作为载体展示的图片

package com.example.a51044.week3.fragment1;

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.TextView;

import com.example.a51044.week3.Daoceng.Dao;
import com.example.a51044.week3.R;

public class FragmentB extends Fragment {
    private View view;
    private TextView tv;
    private Dao dao;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.item, null);
        dao=new Dao(getActivity().getApplicationContext());
        initView(view);
        tv.setText(dao.selSql().toString());
        return view;
    }

    private void initView(View view) {
        tv = (TextView) view.findViewById(R.id.tv);
    }
}

创建数据库的的Helper:

package com.example.a51044.week3.Helper;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.annotation.Nullable;

public class MyHelper extends SQLiteOpenHelper {
    public MyHelper(Context context) {
        super(context, "aaa", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table if not exists lgq(id Integer primary key autoincrement,title text,content text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

我数据库的Dao层:

package com.example.a51044.week3.Daoceng;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.a51044.week3.Helper.MyHelper;
import com.example.a51044.week3.bean.Databases;
import com.example.a51044.week3.bean.MyData;

import java.util.ArrayList;
import java.util.List;

public class Dao {
    private SQLiteDatabase db;

    public Dao(Context context) {
        MyHelper he=new MyHelper(context);
        db=he.getWritableDatabase();
    }

//添加数据的方法
    public void addSql(List<MyData.DataBean>bean)
    {

        for(int i=0;i<bean.size();i++)
        {
            ContentValues va=new ContentValues();
            MyData.DataBean dataBean=bean.get(i);
            va.put("title",dataBean.getNews_title());
            va.put("content",dataBean.getNews_summary());
            db.insert("lgq",null,va);
        }


    }

//这是查询的方法
    public List<Databases>selSql()
    {
        List<Databases>data=new ArrayList<>();
        Cursor myCursor=db.query("lgq",null,null,null,null,null,null);
        while (myCursor.moveToNext())
        {
            int id=myCursor.getInt(myCursor.getColumnIndex("id"));
            String title=myCursor.getString(myCursor.getColumnIndex("title"));
            String content=myCursor.getString(myCursor.getColumnIndex("content"));
            Databases d=new Databases(id,title,content);
            data.add(d);
        }
        return data;
    }
}

要写Image-loader
必须写一个类,并且在清单文件注册一下 android:name=".app.MyApp"
.app.MyApp是我的路径
Image-loader是我从网上找到的方法,改了一下:

package com.example.a51044.week3.app;

import android.app.Application;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        
        ImageLoaderConfiguration loaderConfiguration = ImageLoaderConfiguration.createDefault(this);
        ImageLoader.getInstance().init(loaderConfiguration);

    }
}

接下来就是我的适配器代码

package com.example.a51044.week3.Adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.a51044.week3.R;
import com.example.a51044.week3.bean.MyData;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;

import java.util.List;

public class MyListAdapter extends BaseAdapter {
    private List<MyData.DataBean> mList;
    private Context mContext;
    private DisplayImageOptions displayImageOptions;

    public MyListAdapter(List<MyData.DataBean> mList, Context mContext) {
        this.mList = mList;
        this.mContext = mContext;
        displayImageOptions = new DisplayImageOptions.Builder().showStubImage(0).showImageForEmptyUri(0).showImageOnFail(0).cacheOnDisk(true).cacheInMemory(true).imageScaleType(ImageScaleType.IN_SAMPLE_INT).bitmapConfig(android.graphics.Bitmap.Config.RGB_565).displayer(new RoundedBitmapDisplayer(50)).build();
    }

    public void setmList(List<MyData.DataBean> mList) {
        this.mList = mList;
        //一定要加刷新
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mList.isEmpty() ? 0 : mList.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = View.inflate(mContext, R.layout.item, null);
            holder = new ViewHolder();
            holder.iv = convertView.findViewById(R.id.iv);
            holder.tv = convertView.findViewById(R.id.tv);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tv.setText(mList.get(position).getNews_title());
        ImageLoader.getInstance().displayImage(mList.get(position).getPic_url(),holder.iv,displayImageOptions);
        return convertView;
    }

    class ViewHolder {
        ImageView iv;
        TextView tv;
    }
}

轮播图适配器:

package com.example.a51044.week3.Adapter;

import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

public class MyLunboAdapter extends PagerAdapter {
    private List<View>mList;

    public MyLunboAdapter(List<View> mList) {
        this.mList = mList;
    }

    public void setmList(List<View> mList) {
        this.mList = mList;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view==o;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        container.addView(mList.get(position));
        return mList.get(position);
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(mList.get(position));
    }
}

切换Fragment的适配器

package com.example.a51044.week3.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;

public class MyPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> mList;
    private List<String>mTitle;

    public MyPagerAdapter(FragmentManager fm, List<Fragment> mList, List<String> mTitle) {
        super(fm);
        this.mList = mList;
        this.mTitle = mTitle;
    }

    @Override
    public Fragment getItem(int i) {
        return mList.get(i);
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mTitle.get(position);
    }
}

以上就是我的总结,本以为写博客是很简单的事情,但要做一个好的博客,会耗费大量时间。我会努力的,同时也希望各位大神多多指教,多多评论!我爱android!

祝各位技术越来越好,身体健康。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值