嗨,大家好
今天为大家整理了我以前学过的知识点:
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!
祝各位技术越来越好,身体健康。