BaseActivity:
public abstract class BaseActivity extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResId());
initView(savedInstanceState);
initData();
}
protected abstract void initData();
protected abstract void initView(Bundle savedInstanceState);
protected abstract int getLayoutResId();
}
BaseFragment:
public abstract class BaseFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(getLayoutResId(),container,false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
initView(view);
initData();
}
protected abstract void initData();
protected abstract void initView(View view);
public abstract int getLayoutResId() ;
}
侧滑+TabLayout:
MainXml:
<RelativeLayout
android:id="@+id/rela"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:tabGravity="fill"
></android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/tab"
></android.support.v4.view.ViewPager>
</RelativeLayout>
<FrameLayout
android:id="@+id/frame"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="start"
></FrameLayout>
fragmentleft.xml:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#fff"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
></ListView>
</android.support.constraint.ConstraintLayout>
二次采样的工具类:
public class ImaegUtil {
public interface CallBack{
void getdata(Bitmap bitmap);
}
public static void yibu(String uri, final int width, final int height, final CallBack callBack){
new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... strings) {
return ImaegUtil.ercicaiyang(strings[0],width,height);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
callBack.getdata(bitmap);
}
}.execute(uri);
}
//二次采样
public static Bitmap ercicaiyang(String uri,int width,int height){
BitmapFactory.Options options = new BitmapFactory.Options();
//第一次只加载宽高信息
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile(uri,options);
//根据图片原始宽高 和请求宽高 计算采样率
options.inSampleSize=Math.max(options.outWidth/width,options.outHeight/height);
//第二次加载图片
options.inJustDecodeBounds=false;
Bitmap bitmap = BitmapFactory.decodeFile(uri, options);
return bitmap;
}
}
Fragmentleft:
public class Fragmentleft extends BaseFragment {
private Letfadapter letfadapter;
private ListView listView;
private final int ZHI=100;
@Override
protected void initData() {
List<String> list=new ArrayList<>();
list.add("首页");
list.add("电影");
list.add("消息");
letfadapter.setList(list);
}
@Override
protected void initView(View view) {
listView = view.findViewById(R.id.listview);
letfadapter = new Letfadapter(getActivity());
listView.setAdapter(letfadapter);
//条目点击
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//判断下标是否为0
if (position==0){
Intent intent=new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,ZHI);
}
//点击切换到哪个界面
((MainActivity)getActivity()).cc(position-1);
}
});
}
@Override
public int getLayoutResId() {
return R.layout.fragmentleft;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode==ZHI&&resultCode==getActivity().RESULT_OK){
Uri uri=data.getData();
progeressImage(Url2path(uri));
}
}
//二次采样并把图片传给适配器
private void progeressImage(String imagePath) {
int size = getResources().getDimensionPixelSize(R.dimen.leftIconSize);
ImaegUtil.yibu(imagePath, size, size, new ImaegUtil.CallBack() {
@Override
public void getdata(Bitmap bitmap) {
letfadapter.setBitmap(bitmap);
}
});
}
//Uri转换为字符流
private String Url2path(Uri uri) {
String[] proj={MediaStore.Images.Media.DATA};
CursorLoader loader = new CursorLoader(getActivity(), uri, proj, null, null, null);
Cursor cursor = loader.loadInBackground();
int columnIndexOrThrow = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(columnIndexOrThrow);
}
}
string文件夹创建dimen.xml:
<resources>
<dimen name="leftIconSize">100dp</dimen>
</resources>
tab布局的适配器:
public class Mainadapter extends FragmentPagerAdapter {
private String[] ming=new String[]{"首页","电影","我的"};
public Mainadapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i){
case 0:
return new Fragmentone();
case 1:
return new Fragmenttwo();
case 2:
return new Fragmentthree();
}
return null;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return ming[position];
}
@Override
public int getCount() {
return ming.length;
}
}
Activity:
public class MainActivity extends BaseActivity {
private DrawerLayout draw;
private ActionBarDrawerToggle toggle;
private ViewPager viewPager;
private TabLayout tab;
@Override
protected void initData() {
}
@Override
protected void initView(Bundle savedInstanceState) {
//获取资源ID
draw = findViewById(R.id.draw);
//获取标题上的按钮
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//中间人
toggle = new ActionBarDrawerToggle(this,draw,R.string.open,R.string.close);
draw.addDrawerListener(toggle);
toggle.syncState();
//往侧滑里添加fragment
if (savedInstanceState==null){
getSupportFragmentManager().beginTransaction()
.add(R.id.frame,new Fragmentleft())
.commit();
}
//获取资源ID
viewPager = findViewById(R.id.viewpager);
tab = findViewById(R.id.tab);
//设置适配器
viewPager.setAdapter(new Mainadapter(getSupportFragmentManager()));
//根据viewpager设置TabLayout
tab.setupWithViewPager(viewPager);
}
//点击切换到哪个界面
public void cc(int posintion){
viewPager.setCurrentItem(posintion);
draw.closeDrawer(Gravity.START);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (toggle.onOptionsItemSelected(item)){
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected int getLayoutResId() {
return R.layout.activity_main;
}
}
子条目布局:
item_image.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:src="@mipmap/ic_launcher"
/>
</RelativeLayout>
item_text.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="gedbfavd" />
</RelativeLayout>
Letfadapter:
public class Letfadapter extends BaseAdapter {
private Bitmap bitmap;//图片
private List<String> list;//菜单数据
private Context context;
private final int ITEM_COUNT=2;
private final int ITEM_IMAGE=0;
private final int ITEM_TEXT=1;
public Letfadapter(Context context) {
this.context = context;
//初始化
list=new ArrayList<>();
}
public void setBitmap(Bitmap sbitmap) {
bitmap=sbitmap;
notifyDataSetChanged();
}
public void setList(List<String> slist) {
list.clear();
if (slist!=null){
list.addAll(slist);
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return list.size()+1;
}
@Override
public String getItem(int position) {
//第0个item是图片
//真正的文本item是从1开始
return list.get(position-1);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return ITEM_COUNT;
}
@Override
public int getItemViewType(int position) {
return position==0?ITEM_IMAGE:ITEM_TEXT;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView==null){
convertView=LayoutInflater.from(context).inflate(
getItemViewType(position)==ITEM_IMAGE? R.layout.item_image:R.layout.item_text
,parent,false);
holder=new ViewHolder(convertView);
}else{
holder= (ViewHolder) convertView.getTag();
}
//判断下标为0的时候是否是图片
if (getItemViewType(position)==ITEM_IMAGE){
if (bitmap!=null){
holder.getbitmap(bitmap);
}
}else{
holder.gettext(getItem(position));
}
return convertView;
}
class ViewHolder{
private ImageView image;
private TextView text;
public ViewHolder(View convertView) {
image=convertView.findViewById(R.id.image);
text=convertView.findViewById(R.id.text);
convertView.setTag(this);
}
public void getdata(String item) {
}
public void getbitmap(Bitmap bitmap) {
image.setImageBitmap(bitmap);
}
public void gettext(String item) {
text.setText(item);
}
}
}
抽屉布局:
fragmenttwo.xml:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent">
<android.support.design.widget.TabLayout
android:id="@+id/tabl"
android:layout_width="0dp"
app:tabGravity="fill"
app:tabMaxWidth="0dp"
app:tabMode="fixed"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
></android.support.design.widget.TabLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tabl"></android.support.v4.view.ViewPager>
</android.support.constraint.ConstraintLayout>
Fragmenttwo:
public class Fragmenttwo extends BaseFragment {
@Override
protected void initData() {
}
@Override
protected void initView(View view) {
ViewPager viewPager=view.findViewById(R.id.pager);
TabLayout tab=view.findViewById(R.id.tabl);
viewPager.setAdapter(new Ziadapter(getChildFragmentManager()));
//通过viewpage设置TabLayout
tab.setupWithViewPager(viewPager);
}
@Override
public int getLayoutResId() {
return R.layout.fragmenttwo;
}
}
抽屉布局的适配器:
Ziadapter:
public class Ziadapter extends FragmentPagerAdapter {
private String[] liang=new String[]{"正在上映","即将上映"};
private String[] urls=new String[]{
"http://172.17.8.100/movieApi/movie/v1/findHotMovieList?count=10&page=",
"http://172.17.8.100/movieApi/movie/v1/findReleaseMovieList?count=10&page="
};
public Ziadapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i){
default:
Bundle bundle=new Bundle();
bundle.putString("url",urls[i]);
Fragmentzi fragmentzi = new Fragmentzi();
fragmentzi.setArguments(bundle);
return fragmentzi;
}
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return liang[position];
}
@Override
public int getCount() {
return liang.length;
}
}
刷新加载:
frag.xml:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#ccc"
android:layout_height="match_parent">
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pull"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"></com.handmark.pulltorefresh.library.PullToRefreshListView>
</android.support.constraint.ConstraintLayout>
Fragmentzi:
public class Fragmentzi extends BaseFragment {
private PullToRefreshListView pull;
private Moiveadapter moive;
private final int COUNT=10;
@Override
protected void initData() {
NetUtil.yibu(url + page, Bean.class, new NetUtil.CallBack<Bean>() {
@Override
public void getdata(Bean o) {
if (o==null||!o.ispanduan()){
Toast.makeText(getActivity(), "数据请求失败", Toast.LENGTH_SHORT).show();
//停止刷新加载
pull.onRefreshComplete();
return;
}
//数据库删除
if (page==1){
Dao.getInstance(getActivity()).del(url.hashCode());
}
//添加数据库
Dao.getInstance(getActivity()).addall(url.hashCode(),o.getResult());
if (page==1){
//moive.setList(o.getResult());
moive.setList(Dao.getInstance(getActivity()).query(url.hashCode()));
}else{
//moive.adddList(o.getResult());
moive.setList(Dao.getInstance(getActivity()).query(url.hashCode()));
}
page++;
//停止刷新加载
pull.onRefreshComplete();
//是否可以下拉加载
if (o.getResult().size()<COUNT){
pull.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
}else{
pull.setMode(PullToRefreshBase.Mode.BOTH);
}
}
});
}
private String url;
private int page=1;
@Override
protected void initView(View view) {
url=getArguments().getString("url");
pull = view.findViewById(R.id.pull);
//设置适配器
moive = new Moiveadapter(getActivity());
//开启适配器
pull.setAdapter(moive);
//设置支持刷新加载
pull.setMode(PullToRefreshBase.Mode.BOTH);
//设置刷新加载监听
pull.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
page=1;
initData();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
initData();
}
});
}
@Override
public int getLayoutResId() {
return R.layout.frag;
}
}
刷新,加载的适配器:
public class Moiveadapter extends BaseAdapter {
private List<Bean.Result> list;
private Context context;
public Moiveadapter(Context context) {
this.context = context;
list=new ArrayList<>();
}
//刷新list
public void setList(List<Bean.Result> slist) {
list.clear();
if (slist!=null){
list.addAll(slist);
}
notifyDataSetChanged();
}
//加载更多
public void adddList(List<Bean.Result> slist) {
if (slist!=null){
list.addAll(slist);
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return list.size();
}
@Override
public Bean.Result 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.list,parent,false);
holder=new ViewHolder(convertView);
}else{
holder= (ViewHolder) convertView.getTag();
}
holder.getdata(getItem(position));
return convertView;
}
class ViewHolder{
private ImageView image;
private TextView name;
private TextView message;
public ViewHolder(View convertView) {
image=convertView.findViewById(R.id.tu);
name=convertView.findViewById(R.id.name);
message=convertView.findViewById(R.id.message);
convertView.setTag(this);
}
public void getdata(Bean.Result item) {
name.setText(item.getName());
message.setText(item.getSummary());
ImageLoader.getInstance().displayImage(item.getImageUrl(),image);
}
}
}
配置图片:
APP:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
//格式配置
DisplayImageOptions options=new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.displayer(new RoundedBitmapDisplayer(20))
.build();
//全局配置
ImageLoaderConfiguration configuration=new ImageLoaderConfiguration.Builder(this)
.memoryCacheSizePercentage(10)
.diskCacheSize(20*1024*1024)
.defaultDisplayImageOptions(options)
.build();
//初始化
ImageLoader.getInstance().init(configuration);
}
}
请求网络工具类:
public class NetUtil {
//接口回调
public interface CallBack<T>{
void getdata(T t);
}
//异步任务
public static void yibu(String lujing, final Class clazz, final CallBack callBack){
new AsyncTask<String, Void, Object>() {
@Override
protected Object doInBackground(String... strings) {
return NetUtil.jiexi(strings[0],clazz);
}
@Override
protected void onPostExecute(Object o) {
callBack.getdata(o);
}
}.execute(lujing);
}
//网络解析
public static <T>T jiexi(String lujing,Class clazz){
T t= (T) new Gson().fromJson(NetUtil.geturl(lujing),clazz);
return t;
}
//网络请求
public static String geturl(String lujing){
String result="";
//定义地址
try {
URL url=new URL(lujing);
//打开连接
HttpURLConnection urlConnection= (HttpURLConnection) url.openConnection();
//定义方法
urlConnection.setRequestMethod("GET");
//读取超时
urlConnection.setReadTimeout(5000);
//连接超时
urlConnection.setConnectTimeout(5000);
if (urlConnection.getResponseCode()==200){
result=NetUtil.zifu(urlConnection.getInputStream());
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
//字节流转换为字符流
private static String zifu(InputStream inputStream) throws IOException {
InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
BufferedReader buff=new BufferedReader(inputStreamReader);
StringBuilder builder=new StringBuilder();
for (String imp=buff.readLine();imp!=null;imp=buff.readLine()){
builder.append(imp);
}
return builder.toString();
}
}
创建数据库:
public class SqliteHelper extends SQLiteOpenHelper {
private static final String name="user.db";
private static final int version=1;
public SqliteHelper(@Nullable Context context) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table users(_id integer primary key autoincrement ," +
"id integer," +
"name text," +
"message text," +
"image text," +
"type text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
数据库Dao层:
public class Dao {
private static Dao instance;
private SqliteHelper helper;
private SQLiteDatabase sb;
private Dao(Context context){
helper=new SqliteHelper(context);
sb=helper.getReadableDatabase();
}
public static Dao getInstance(Context context){
if (instance==null){
instance=new Dao(context);
}
return instance;
}
public void add(int type, Bean.Result bean){
ContentValues values=new ContentValues();
values.put("id",bean.getId());
values.put("image",bean.getImageUrl());
values.put("name",bean.getName());
values.put("message",bean.getSummary());
values.put("type",type);
long users = sb.insert("users", null, values);
Log.i("TEST",""+users);
}
public void addall(int type, List<Bean.Result> list){
for (Bean.Result bean : list){
add(type,bean);
}
}
public List<Bean.Result> query(int type){
List<Bean.Result> list=new ArrayList<>();
Cursor cursor = sb.query("users", null, "type=?", new String[]{String.valueOf(type)}, null, null, null);
if (cursor!=null){
while(cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String image = cursor.getString(cursor.getColumnIndex("image"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String message = cursor.getString(cursor.getColumnIndex("message"));
Bean.Result res=new Bean.Result(id,image,name,message);
list.add(res);
}
cursor.close();
}
return list;
}
public void del(int type){
sb.delete("users","type=?",new String[]{String.valueOf(type)});
}
}