首先是登录主页面
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText ed_name;
private EditText ed_password;
private CheckBox check_jz;
private Button btn_login;
private SharedPreferences mSp;
private boolean mIscheck_jz;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
mSp = getSharedPreferences("cmf", MODE_PRIVATE);
mIscheck_jz = mSp.getBoolean("ischeck_jz", false);
String name = mSp.getString("name", "");
String pwd = mSp.getString("pwd", "");
if (mIscheck_jz){
ed_name.setText(name);
ed_password.setText(pwd);
check_jz.setChecked(true);
}
}
private void initView() {
ed_name = (EditText) findViewById(R.id.ed_name);
ed_password = (EditText) findViewById(R.id.ed_password);
check_jz = (CheckBox) findViewById(R.id.check_jz);
btn_login = (Button) findViewById(R.id.btn_login);
btn_login.setOnClickListener(this);
}
@SuppressLint("CommitPrefEdits")
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_login:
String mname = ed_name.getText().toString().trim();
String mpwd = ed_password.getText().toString().trim();
if (TextUtils.isEmpty(mname)||TextUtils.isEmpty(mpwd)){
Toast.makeText(MainActivity.this,"登陆失败",Toast.LENGTH_SHORT).show();
}else {
if(check_jz.isChecked()){
SharedPreferences.Editor edit=mSp.edit();
edit.putString("name",mname);
edit.putString("pwd",mpwd);
edit.putBoolean("ischeck_jz",true);
edit.commit();
}
Toast.makeText(MainActivity.this,"登陆成功",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, ShowActivity.class);
startActivity(intent);
}
break;
}
}
}
其次是信息展示页面的布局文件
public class ShowActivity extends AppCompatActivity implements MyView {
public int REQUEST_CODE = 5;//扫描二维码
private ImageView mSaoYiSao;
private GridView mGridViewImg;
private ViewFlipper mViewFlipper;
private GridView mGridViewShop;
private ArrayList<Sudoku.DataBean> sList;
private ArrayList<Datas.DataBean> dList;
private MyPrenter mMyPrenter;
private RecyclerView mRecyclerview;
private RecyclerView mRecyclerViewJ;
private SudokuAdapter mSudokuAdapter;
private DatasAdapter mDatasAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
initView();
//2 跑马灯设置
setViewFlipper();
//3 点击扫一扫设置
setQTCode();
//4 九宫格 设置
setJGGAndShop();
}
private void setJGGAndShop() {
//创建一个List
sList = new ArrayList<>();//九宫格
dList = new ArrayList<>();//shop商品
//adapter 另一种形式
mSudokuAdapter = new SudokuAdapter(this, sList);
mDatasAdapter = new DatasAdapter(this, dList);
//另一种形式
mRecyclerViewJ.setAdapter(mSudokuAdapter);
mRecyclerview.setAdapter(mDatasAdapter);
//5 初始化presenter层
mMyPrenter = new MyPrenter();
mMyPrenter.attach(this);
mMyPrenter.getPData();
mMyPrenter.getShopData();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//二维码扫描返回结果
if(requestCode == REQUEST_CODE){
if(null != data){
Bundle bundle = data.getExtras();
if(bundle == null){
return;
}
if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS){
String result = bundle.getString(CodeUtils.RESULT_STRING);
Toast.makeText(ShowActivity.this,"解析结果:"+result,Toast.LENGTH_SHORT).show();
}else if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED){
Toast.makeText(ShowActivity.this,"解析失败!",Toast.LENGTH_SHORT).show();
}
}
}
}
/**
* //3 点击扫一扫设置
* */
private void setQTCode() {
mSaoYiSao.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//进行跳转
Intent intent = new Intent(ShowActivity.this, CaptureActivity.class);
startActivityForResult(intent,REQUEST_CODE);
}
});
}
/**
* //2 跑马灯设置
* */
private void setViewFlipper() {
//使用for循环添加
for (int i = 0; i < 3; i++) {
if(i==0){
View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewflipper_1,null);
mViewFlipper.addView(view);
}else if(i==1){
View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewflipper_2,null);
mViewFlipper.addView(view);
}else if(i==2){
View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.viewflipper_3,null);
mViewFlipper.addView(view);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mMyPrenter != null) {
mMyPrenter.datach();
}
}
private void initView() {
mSaoYiSao = (ImageView) findViewById(R.id.saoyisao);
mRecyclerViewJ = (RecyclerView) findViewById(R.id.recyclerviewJ);
mViewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
mRecyclerview = (RecyclerView) findViewById(R.id.recyclerview);
RecyclerView.LayoutManager layoutManagerJ = new StaggeredGridLayoutManager(3,LinearLayoutManager.VERTICAL);
mRecyclerViewJ.setLayoutManager(layoutManagerJ);
//瀑布流
RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(2,LinearLayoutManager.HORIZONTAL);
mRecyclerview.setLayoutManager(layoutManager);//布局
//分割线
// mRecyclerview.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
//动画
mRecyclerview.setItemAnimator(new DefaultItemAnimator());
}
@Override
public void Sudoku(ArrayList<Sudoku.DataBean> list) {
if(list!=null){
sList.clear();
sList.addAll(list);
mSudokuAdapter.notifyDataSetChanged();
}
}
@Override
public void ProductData(ArrayList<Datas.DataBean> list) {
if(list!=null){
dList.clear();
dList.addAll(list);
mDatasAdapter.notifyDataSetChanged();
}
}
@Override
public void Friand(Exception e) {
Toast.makeText(ShowActivity.this,"网络异常",Toast.LENGTH_SHORT).show();
}
}
两个接口其中一个接口中有3个方法另一个是两个
public interface MyView{
void Sudoku(ArrayList<Sudoku.DataBean> list);
void ProductData(ArrayList<Datas.DataBean> list);
void Friand(Exception e);
}
public interface MyCallback {
void OnSuccess(Object o);
void OnFriand(Exception e);
}
然后就是写实体类,然后就是写网络请求工具类的代码我采用的okhttp
public class OKHttputil {
//定义一个工具类对象
private static volatile OKHttputil sOKHttputil;
private final OkHttpClient mOkHttpClient;
private Handler mHandler = new Handler();
//创建一个无参构造方法
public OKHttputil(){
mOkHttpClient = new OkHttpClient();
}
//创建一个公共的静态方法
public static OKHttputil getOKHttputil(){
if (sOKHttputil==null){
synchronized (OKHttputil.class){
if (null==sOKHttputil){
sOKHttputil=new OKHttputil();
}
}
}
return sOKHttputil;
}
//定义一个请求数据的方法
public void getData(String url, final MyCallback myCallback, final Type type){
Request request = new Request.Builder()
.get()
.url(url)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
mHandler.post(new Runnable() {
@Override
public void run() {
myCallback.OnFriand(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(string, type);
mHandler.post(new Runnable() {
@Override
public void run() {
myCallback.OnSuccess(o);
}
});
}
});
}
}
紧接着是写一个model层去调用网络工具类的获得数据的方法
public class MyModel {
//定义一个m层请求数据的方法
public void getMData(String url, MyCallback myCallback, Type type){
OKHttputil.getOKHttputil().getData(url,myCallback,type);
}
}
然后就是书写p层逻辑代码,在p层调用m层请求数据代码,p层中有一个view层和model层交互的方法以及一个销毁的方法
public class MyPrenter {
//创建view和model对象
private MyView mMyView;
private MyModel mMyModel;
//初始化对象
public void attach(MyView myView){
this.mMyView=myView;
mMyModel=new MyModel();
}
//定义一个p层得到数据的方法
public void getPData(){
//初始化Type 泛型
Type type = new TypeToken<Sudoku>(){}.getType();
//调用登录方法 并实现方法
mMyModel.getMData("http://www.zhaoapi.cn/product/getCatagory", new MyCallback() {
@Override
public void OnSuccess(Object o) {
Sudoku sudoku = (Sudoku) o;
ArrayList<Sudoku.DataBean> data = (ArrayList<Sudoku.DataBean>) sudoku.getData();
if(sudoku!=null) {
mMyView.Sudoku(data);
}
}
@Override
public void OnFriand(Exception e) {
mMyView.Friand(e);
}
}, type);
}
public void getShopData(){
//初始化Type 泛型
Type type = new TypeToken<Datas>(){}.getType();
//调用登录方法 并实现方法
mMyModel.getMData("http://www.wanandroid.com/tools/mockapi/6523/restaurants_offset_0_limit_4", new MyCallback() {
@Override
public void OnSuccess(Object o) {
Datas shopBean = (Datas) o;
if(shopBean!=null){
ArrayList<Datas.DataBean> data = (ArrayList<Datas.DataBean>) shopBean.getData();
mMyView.ProductData(data);
}
}
@Override
public void OnFriand(Exception e) {
mMyView.Friand(e);
}
}, type);
}
//解绑的方法
public void datach(){
if (mMyView!=null){
mMyView=null;
}
}
}
适配器,因为我的布局文件中用的是RecyclerView用来代替listview
public class SudokuAdapter extends RecyclerView.Adapter<SudokuAdapter.ViewHolder> {
private Context mContext;
private ArrayList<Sudoku.DataBean> list;
public SudokuAdapter(Context context, ArrayList<Sudoku.DataBean> list) {
mContext = context;
this.list=list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v=View.inflate(mContext,R.layout.item_jiugongge,null);
ViewHolder holder = new ViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.mTxtTitle.setText(list.get(position).getName());
Glide.with(mContext).load(list.get(position).getIcon()).into(holder.mJiuGongGe);
}
@Override
public int getItemCount() {
return list.size();
}
//1 需要一個Adapter
class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView mJiuGongGe;
private final TextView mTxtTitle;
public ViewHolder(View itemView) {
super(itemView);
//找控件
mJiuGongGe = itemView.findViewById(R.id.jiugongge_img);
mTxtTitle = itemView.findViewById(R.id.txt_title);
}
}
}
public class DatasAdapter extends RecyclerView.Adapter<DatasAdapter.ViewHolder> {
private Context mContext;
private ArrayList<Datas.DataBean> list;
public DatasAdapter(Context context, ArrayList<Datas.DataBean> list) {
mContext = context;
this.list = list;
}
//2 实现三个方法
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//在创建的时候 做初始化的方法 View 和 holder的初始化
View v = View.inflate(mContext, R.layout.item_shop,null);
ViewHolder holder = new ViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//绑定的方法 用来设置控件的值
holder.mTxtTitle.setText(list.get(position).getName());
Glide.with(mContext).load(list.get(position).getPic_url()).into(holder.mImg);
}
@Override
public int getItemCount() {
return list.size();
}
//1 需要一個Adapter
class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView mImg;
private final TextView mTxtTitle;
public ViewHolder(View itemView) {
super(itemView);
//找控件
mImg = itemView.findViewById(R.id.img);
mTxtTitle = itemView.findViewById(R.id.txt_title);
}
}
}
全局配置的一个类
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ZXingLibrary.initDisplayOpinion(this);
}
}
这是信息展示页面的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".ShowActivity">
//shop界面
//top
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="6"
android:background="#f00"
>
//二维码扫描
<ImageView
android:id="@+id/saoyisao"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/a_s"
/>
<android.support.v7.widget.SearchView
android:layout_width="0dp"
android:layout_weight="5"
android:layout_height="wrap_content"
android:background="@drawable/bg_searchview"
app:queryHint="搜索"
></android.support.v7.widget.SearchView>
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
android:text="商品分类"
android:layout_gravity="center"
android:gravity="center"
android:textColor="#000"
/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
//数据块
<!--<GridView
android:id="@+id/gridview_img"
android:layout_width="match_parent"
android:layout_height="150dp"
android:numColumns="3"
></GridView>-->
//九宮格使用的另一種控件
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerviewJ"
android:layout_width="match_parent"
android:layout_height="200dp"
>
</android.support.v7.widget.RecyclerView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="7"
android:layout_margin="10dp"
>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="公告:"
android:textSize="20dp"
android:background="#f99b43"
/>
//跑马灯效果
<ViewFlipper
android:id="@+id/viewflipper"
android:layout_width="0dp"
android:layout_weight="6"
android:layout_height="wrap_content"
android:autoStart="true"
android:flipInterval="2000"
android:inAnimation="@anim/anto_start_anim"
android:outAnimation="@anim/anto_out_anim"
android:layout_marginLeft="15dp"
></ViewFlipper>
</LinearLayout>
//商品展示
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2"
>
<!--<GridView
android:id="@+id/gridview_shop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="2"
></GridView>-->
//另一种方式展示
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
这是demo中用的的权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
app目录下的gradle文件
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '27.1.1' //这里改为你项目使用的版本即可
}
}
}
}
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'cn.yipianfengye.android:zxing-library:2.2'
implementation 'com.android.support:recyclerview-v7:27.1.1'
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}