简单商品搜索界面的实现,流失布局,历史记录,商品展示,商品详情
2017-12-18 08:10
856 查看
//添加依赖,涉及到json解析,图片加载,ok请求,recyclerview
//添加需要的权限
//util工具类
//MVP模式 m层
//v层
//数据库
//流式布局
//p
//适配器
//适配器 抽取接口
//布局方法
//main布局
//search页面
//goods商品详情界面
//适配器需要加载的界面
//条目布局
//适配器表格布局
compile 'com.squareup.okhttp3:okhttp:3.6.0' compile 'com.squareup.okio:okio:1.11.0' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.youth.banner:banner:1.4.9' compile 'com.orhanobut:logger:2.1.1' compile 'com.google.code.gson:gson:2.8.2' compile 'com.android.support:recyclerview-v7:25.3.1'
//添加需要的权限
<uses-permission android:name="android.permission.INTERNET"/>
//util工具类
public class ApiUtil { public static final String LOGIN_URL = "https://www.zhaoapi.cn/user/login"; public static final String REGIST_URL = "https://www.zhaoapi.cn/user/reg"; public static final String SEARCH_URL = "http://120.27.23.105/product/searchProducts"; }
import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Environment; import android.util.Log; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class OkHttp3Util { /** * 懒汉 安全 加同步 * 私有的静态成员变量 只声明不创建 * 私有的构造方法 * 提供返回实例的静态方法 */ private static OkHttpClient okHttpClient = null; private OkHttp3Util() { } public static OkHttpClient getInstance() { if (okHttpClient == null) { //加同步安全 synchronized (OkHttp3Util.class) { if (okHttpClient == null) { //okhttp可以缓存数据....指定缓存路径 File sdcache = new File(Environment.getExternalStorageDirectory(), "cache"); //指定缓存大小 int cacheSize = 10 * 1024 * 1024; okHttpClient = new OkHttpClient.Builder()//构建器 .connectTimeout(15, TimeUnit.SECONDS)//连接超时 .writeTimeout(20, TimeUnit.SECONDS)//写入超时 .readTimeout(20, TimeUnit.SECONDS)//读取超时 .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize))//设置缓存 .build(); } } } return okHttpClient; } /** * get请求 * 参数1 url * 参数2 回调Callback */ public static void doGet(String url, Callback callback) { //创建OkHttpClient请求对象 OkHttpClient okHttpClient = getInstance(); //创建Request Request request 4000 = new Request.Builder().url(url).build(); //得到Call对象 Call call = okHttpClient.newCall(request); //执行异步请求 call.enqueue(callback); } /** * post请求 * 参数1 url * 参数2 Map<String, String> params post请求的时候给服务器传的数据 * add..("","") * add() */ public static void doPost(String url, Map<String, String> params, Callback callback) { //创建OkHttpClient请求对象 OkHttpClient okHttpClient = getInstance(); //3.x版本post请求换成FormBody 封装键值对参数 FormBody.Builder builder = new FormBody.Builder(); //遍历集合 for (String key : params.keySet()) { builder.add(key, params.get(key)); } //创建Request Request request = new Request.Builder().url(url).post(builder.build()).build(); Call call = okHttpClient.newCall(request); call.enqueue(callback); } /** * post请求上传文件....包括图片....流的形式传任意文件... * 参数1 url * file表示上传的文件 * fileName....文件的名字,,例如aaa.jpg * params ....传递除了file文件 其他的参数放到map集合 * */ public static void uploadFile(String url, File file, String fileName,Map<String,String> params) { //创建OkHttpClient请求对象 OkHttpClient okHttpClient = getInstance(); MultipartBody.Builder builder = new MultipartBody.Builder(); builder.setType(MultipartBody.FORM); //参数 if (params != null){ for (String key : params.keySet()){ builder.addFormDataPart(key,params.get(key)); } } //文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是fileeeee,此处应该改变 builder.addFormDataPart("file",fileName, RequestBody.create(MediaType.parse("application/octet-stream"),file)); //构建 MultipartBody multipartBody = builder.build(); //创建Request Request request = new Request.Builder().url(url).post(multipartBody).build(); //得到Call Call call = okHttpClient.newCall(request); //执行请求 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { //上传成功回调 目前不需要处理 if (response.isSuccessful()){ String s = response.body().string(); com.orhanobut.logger.Logger.e("上传--"+s); } } }); } /** * Post请求发送JSON数据....{"name":"zhangsan","pwd":"123456"} * 参数一:请求Url * 参数二:请求的JSON * 参数三:请求回调 */ public static void doPostJson(String url, String jsonParams, Callback callback) { RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams); Request request = new Request.Builder().url(url).post(requestBody).build(); Call call = getInstance().newCall(request); call.enqueue(callback); } /** * 下载文件 以流的形式把apk写入的指定文件 得到file后进行安装 * 参数er:请求Url * 参数san:保存文件的文件夹....download */ public static void download(final Activity context, final String url, final String saveDir) { Request request = new Request.Builder().url(url).build(); Call call = getInstance().newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { com.orhanobut.logger.Logger.e(e.getLocalizedMessage()); } @Override public void onResponse(Call call, final Response response) throws IOException { InputStream is = null; byte[] buf = new byte[2048]; int len = 0; FileOutputStream fos = null; try { is = response.body().byteStream();//以字节流的形式拿回响应实体内容 //apk保存路径 final String fileDir = isExistDir(saveDir); //文件 File file = new File(fileDir, getNameFromUrl(url)); fos = new FileOutputStream(file); while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } fos.flush(); context.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(context, "下载成功:" + fileDir + "," + getNameFromUrl(url), Toast.LENGTH_SHORT).show(); } }); //apk下载完成后 调用系统的安装方法 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); context.startActivity(intent); } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) is.close(); if (fos != null) fos.close(); } } }); } /** * 判断下载目录是否存在......并返回绝对路径 * * @param saveDir * @return * @throws IOException */ public static String isExistDir(String saveDir) throws IOException { // 下载位置 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir); if (!downloadFile.mkdirs()) { downloadFile.createNewFile(); } String savePath = downloadFile.getAbsolutePath(); Log.e("savePath", savePath); return savePath; } return null; } /** * @param url * @return 从下载连接中解析出文件名 */ private static String getNameFromUrl(String url) { return url.substring(url.lastIndexOf("/") + 1); } }
import android.content.Context; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.youth.banner.loader.ImageLoader; public class GlideImageLoader extends ImageLoader { @Override public void displayImage(Context context, Object path, ImageView imageView) { Glide.with(context).load(path).into(imageView); } }
//MVP模式 m层
import android.util.Log; import com.cuijiajum.sanzhou.bean.AllContent; import com.cuijiajum.sanzhou.persenter.IPresenterSearch; import com.cuijiajum.sanzhou.util.OkHttp3Util; import com.google.gson.Gson; import java.io.IOException; import java.util.HashMap; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; public class SearchModel { private IPresenterSearch iPresenterSearch; public SearchModel(IPresenterSearch iPresenterSearch) { this.iPresenterSearch = iPresenterSearch; } public void getData(String loginUrl, String keywords) { Map<String, String> map = new HashMap<>(); Log.d("++++++++++++++",loginUrl); map.put("keywords",keywords); map.put("page","1"); map.put("source","android"); OkHttp3Util.doGet(loginUrl+"?keywords="+keywords+"&page="+1+"&source="+"android", new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){ String json = response.body().string(); if(json!=null){ //使用原生解析 try { Gson gson = new Gson(); AllContent allContent = gson.fromJson(json, AllContent.class); //使用接口回调 iPresenterSearch.onSuccess(allContent); } catch (Exception e) { e.printStackTrace(); } } } } }); } }
//v层
import android.content.Intent; import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.cuijiajum.sanzhou.Liushi; import com.cuijiajum.sanzhou.R; import com..cuijiajum.sanzhou.shujuku.Dao; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private Liushi mFlowLayout; private EditText name; private Dao dao; private ListView lv; private ArrayAdapter<String> adapter; private List<String> sel; private Button btn; List<String> a=new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFlowLayout = findViewById(R.id.ls); name = findViewById(R.id.name); lv = findViewById(R.id.lv); btn = findViewById(R.id.btn); dao = new Dao(MainActivity.this); sel = dao.sel(); adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, sel); lv.setAdapter(adapter); zhanshi(); initChildViews(); } private void zhanshi() { List<String> sel4 = dao.sel(); ArrayAdapter<String> ada = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, sel4); lv.setAdapter(ada); } private String mNames[] = { "内衣","外套","裤衩", "男鞋","女鞋","text", "name","type","search","logcat", "耐克","阿迪达斯","李宁", "361度","女鞋" }; private void initChildViews() { ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); lp.leftMargin = 10; lp.rightMargin = 10; lp.topMargin = 5; lp.bottomMargin = 5; for (int i = 0; i < mNames.length; i++) { TextView view = new TextView(this); view.setText(mNames[i]); view.setTextColor(Color.WHITE); final int finalI = i; view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this,mNames[finalI], Toast.LENGTH_SHORT).show(); } }); view.setBackgroundDrawable(getResources().getDrawable(R.drawable.textview_bg)); mFlowLayout.addView(view, lp); } } public void delall(View view) { dao.del(); List<String> sel2 = dao.sel(); ArrayAdapter<String> adapter2 = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, sel2); lv.setAdapter(adapter2); Toast.makeText(MainActivity.this,"清除成功",Toast.LENGTH_LONG).show(); btn.setVisibility(View.INVISIBLE); } public void add(View view) { String n = name.getText().toString(); int i = dao.insertJson(n); btn.setVisibility(View.VISIBLE); List<String> sel3 = dao.sel(); a.add(0,n); ArrayAdapter<String> adapter3 = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, a); Intent intent = new Intent(MainActivity.this,SearchActivity.class); intent.putExtra("name",n); startActivity(intent); lv.setAdapter(adapter3); } }
package com.cuijiajum.sanzhou.View; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Toast; import com.cuijiajum.sanzhou.R; import com.cuijiajum.sanzhou.adapter.OnItemClickListner; import com.cuijiajum.sanzhou.adapter.SearchRecyclerAdapter; import com.cuijiajum.sanzhou.adapter.SearchRecyclerGVAdapter; import com.cuijiajum.sanzhou.bean.AllContent; import com.cuijiajum.sanzhou.persenter.SearchPresenter; import com.cuijiajum.sanzhou.util.ApiUtil; import com.gson.Gson; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; public class SearchActivity extends AppCompatActivity implements IViewSearch, OnItemClickListner { private RecyclerView recycler_view; private SearchPresenter searchPresenter; private CheckBox ck; boolean flag = false; private String keywords; private String name; private List<AllContent.DataBean> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); Intent intent = getIntent(); name = intent.getStringExtra("name"); recycler_view = findViewById(R.id.recycler_view); ck = findViewById(R.id.ck); searchPresenter = new SearchPresenter(this); try { keywords = URLEncoder.encode(name, "utf-8"); } catch (Exception e) { e.printStackTrace(); } searchPresenter.getData(ApiUtil.SEARCH_URL,keywords); } @Override public void onSuccess(final AllContent allContent) { runOnUiThread(new Runnable() { @Override public void run() { data = allContent.getData(); Toast.makeText(SearchActivity.this, allContent.getMsg(),Toast.LENGTH_SHORT).show(); //设置适配器 /*SearchRecyclerAdapter adapter = new SearchRecyclerAdapter(SearchActivity.this,data); recycler_view.setAdapter(adapter); recycler_view.setLayoutManager(new LinearLayoutManager(SearchActivity.this, LinearLayout.VERTICAL,false));*/ setAdapter(data); ck.setChecked(flag); ck.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(flag){ //设置管理器、适配器 setAdapter(data); ck.setChecked(false); flag = ck.isChecked(); }else{ SearchRecyclerGVAdapter gvAdapter = new SearchRecyclerGVAdapter(SearchActivity.this, data); recycler_view.setAdapter(gvAdapter); recycler_view.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)); gvAdapter.setOnitemClickListner(new fba8 OnItemClickListner() { @Override public void onItemClick(int position) { Intent intent = new Intent(SearchActivity.this, GoodsActivity.class); intent.putExtra("pid",data.get(0).getPid()); startActivity(intent); } @Override public void onItemLongClickListner(int position) { } }); ck.setChecked(true); flag = ck.isChecked(); } } }); } }); } private void setAdapter(List<AllContent.DataBean> data) { SearchRecyclerAdapter adapter = new SearchRecyclerAdapter(SearchActivity.this,data); recycler_view.setAdapter(adapter); recycler_view.setLayoutManager(new LinearLayoutManager(SearchActivity.this, LinearLayout.VERTICAL,false)); adapter.setOnitemClickListner(this); } @Override public void onItemClick(int position) { Intent intent = new Intent(SearchActivity.this, GoodsActivity.class); intent.putExtra("pid",data.get(0).getPid()); startActivity(intent); } @Override public void onItemLongClickListner(int position) { } }
/** * Created by 李欣 on 2017/12/9. */ public interface IViewSearch { void onSuccess(AllContent allContent); }
import android.content.Intent; import android.graphics.Paint; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.cuijiajum.sanzhou.R; import com.cuijiajum.sanzhou.bean.GoodsBean; import com.cuijiajum.sanzhou.util.GlideImageLoader; import com.cuijiajum.sanzhou.util.OkHttp3Util; import com.google.gson.Gson; import com.youth.banner.Banner; import java.io.IOException; import java.util.ArrayList; import java.util.List; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; public class GoodsActivity extends AppCompatActivity { private int pid; private Banner mbanner; private TextView title_01,price_01,price_02; private List<String> img = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_goods); Intent intent = getIntent(); pid = intent.getIntExtra("pid", 0); mbanner = findViewById(R.id.mbanner); title_01 = findViewById(R.id.title_goods); price_01 = findViewById(R.id.price_01_goods); price_02 = findViewById(R.id.price_02_goods); price_01.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG); OkHttp3Util.doGet("https://www.zhaoapi.cn/product/getProductDetail?pid="+pid+"&source=android", new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){ String json = response.body().string(); Gson gson = new Gson(); GoodsBean goodsBean = gson.fromJson(json, GoodsBean.class); String images = goodsBean.getData().getImages(); final double bargainPrice = goodsBean.getData().getBargainPrice(); final double price = goodsBean.getData().getPrice(); final String title = goodsBean.getData().getTitle(); String[] split = images.split("\\|"); for (String str :split){ img.add(str); } runOnUiThread(new Runnable() { @Override public void run() { //设置图片加载器 mbanner.setImageLoader(new GlideImageLoader()); //设置图片集合 mbanner.setImages(img); //设置自动轮播,默认为true mbanner.isAutoPlay(false); //设置轮播时间 mbanner.setDelayTime(1500); //banner设置方法全部调用完毕时最后调用 mbanner.start(); title_01.setText(title); price_01.setText("原价:¥"+price+""); price_02.setText("优惠价:¥"+bargainPrice+""); } }); } } }); } public void add_gouwuche(View view) { OkHttp3Util.doGet("https://www.zhaoapi.cn/product/addCart?pid=" + pid + "&uid=2809&source=android", new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()){ String string = response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(GoodsActivity.this,"添加成功",Toast.LENGTH_SHORT).show(); } }); } } }); } }
//数据库
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class Myhelpher extends SQLiteOpenHelper { public Myhelpher(Context context) { super(context,"sss.db",null, 2); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { //创建表 sqLiteDatabase.execSQL("create table shuju1(id integer primary key autoincrement,json text not null)"); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }
import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.List; public class Dao { private Myhelpher my; private SQLiteDatabase db; private SQLiteDatabase d; public Dao(Context context) { my= new Myhelpher(context); } /** * 插入数据的操作 */ public int insertJson(String json){ SQLiteDatabase database = my.getWritableDatabase(); //再去添加 ContentValues values = new ContentValues(); values.put("json",json); database.insert("shuju1",null,values); //关闭 database.close(); return 1; } public List<String> sel(){ d = my.getReadableDatabase(); List<String> list=new ArrayList<>(); Cursor cursor = d.rawQuery("select * from shuju1", null); while (cursor.moveToNext()){ String s = cursor.getString(1); list.add(s); } return list; } public void del(){ db = my.getWritableDatabase(); db.execSQL("delete from shuju1"); } public int delyi(String i){ db = my.getWritableDatabase(); db.execSQL("delete from shuju1 where json=?",new String[]{i}); return 1; } }
//流式布局
import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * Created by hasee on 2017/12/16. */ public class Liushi extends ViewGroup { //存储所有子View private List<List<View>> mAllChildViews = new ArrayList<>(); //每一行的高度 private List<Integer> mLineHeight = new ArrayList<>(); public Liushi(Context context) { super(context); } public Liushi(Context context, AttributeSet attrs) { super(context, attrs); } public Liushi(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //父控件传进来的宽度和高度以及对应的测量模式 int sizeWidth = MeasureSpec.getSize(widthMeasureSpec); int modeWidth = MeasureSpec.getMode(widthMeasureSpec); int sizeHeight = MeasureSpec.getSize(heightMeasureSpec); int modeHeight = MeasureSpec.getMode(heightMeasureSpec); //如果当前ViewGroup的宽高为wrap_content的情况 int width = 0;//自己测量的 宽度 int height = 0;//自己测量的高度 //记录每一行的宽度和高度 int lineWidth = 0; int lineHeight = 0; //获取子view的个数 int childCount = getChildCount(); for(int i = 0;i < childCount; i ++){ View child = getChildAt(i); //测量子View的宽和高 measureChild(child, widthMeasureSpec, heightMeasureSpec); //得到LayoutParams MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams(); //子View占据的宽度 int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin; //子View占据的高度 int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; //换行时候 if(lineWidth + childWidth > sizeWidth){ //对比得到最大的宽度 width = Math.max(width, lineWidth); //重置lineWidth lineWidth = childWidth; //记录行高 height += lineHeight; lineHeight = childHeight; }else{//不换行情况 //叠加行宽 lineWidth += childWidth; //得到最大行高 lineHeight = Math.max(lineHeight, childHeight); } //处理最后一个子View的情况 if(i == childCount -1){ width = Math.max(width, lineWidth); height += lineHeight; } } //wrap_content setMeasuredDimension(modeWidth == MeasureSpec.EXACTLY ? sizeWidth : width, modeHeight == MeasureSpec.EXACTLY ? sizeHeight : height); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean b, int l, int i1, int i2, int i3) { mAllChildViews.clear(); mLineHeight.clear(); //获取当前ViewGroup的宽度 int width = getWidth(); int lineWidth = 0; int lineHeight = 0; //记录当前行的view List<View> lineViews = new ArrayList<View>(); int childCount = getChildCount(); for(int i = 0;i < childCount; i ++){ View child = getChildAt(i); MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); int childWidth = child.getMeasuredWidth(); int childHeight = child.getMeasuredHeight(); //如果需要换行 if(childWidth + lineWidth + lp.leftMargin + lp.rightMargin > width){ //记录LineHeight mLineHeight.add(lineHeight); //记录当前行的Views mAllChildViews.add(lineViews); //重置行的宽高 lineWidth = 0; lineHeight = childHeight + lp.topMargin + lp.bottomMargin; //重置view的集合 lineViews = new ArrayList(); } lineWidth += childWidth + lp.leftMargin + lp.rightMargin; lineHeight = Math.max(lineHeight, childHeight + lp.topMargin + lp.bottomMargin); lineViews.add(child); } //处理最后一行 mLineHeight.add(lineHeight); mAllChildViews.add(lineViews); //设置子View的位置 int left = 0; int top = 0; //获取行数 int lineCount = mAllChildViews.size(); for(int i = 0; i < lineCount; i ++){ //当前行的views和高度 lineViews = mAllChildViews.get(i); lineHeight = mLineHeight.get(i); for(int j = 0; j < lineViews.size(); j ++){ View child = lineViews.get(j); //判断是否显示 if(child.getVisibility() == View.GONE){ continue; } MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); int cLeft = left + lp.leftMargin; int cTop = top + lp.topMargin; int cRight = cLeft + child.getMeasuredWidth(); int cBottom = cTop + child.getMeasuredHeight(); //进行子View进行布局 child.layout(cLeft, cTop, cRight, cBottom); left += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin; } left = 0; top += lineHeight; } } /** 159. * 与当前ViewGroup对应的LayoutParams 160. */ @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { // TODO Auto-generated method stub return new MarginLayoutParams(getContext(), attrs); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; } return true; } }
//p
public interface IPresenterSearch { void onSuccess(AllContent allContent); }
import com.cuijiajum.sanzhou.View.IViewSearch; import com.cuijiajum.sanzhou.View.SearchActivity; import com.cuijiajum.sanzhou.bean.AllContent; import com.cuijiajum.sanzhou.model.SearchModel; public class SearchPresenter implements IPresenterSearch{ SearchModel searchModel = new SearchModel(this); private IViewSearch iViewSearch; public SearchPresenter(SearchActivity iViewSearch) { this.iViewSearch = iViewSearch; } public void getData(String searchUrl, String keywords) { searchModel.getData(searchUrl,keywords); } @Override public void onSuccess(AllContent allContent) { iViewSearch.onSuccess(allContent); } }
//适配器
import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class SearchRecyclerHolder extends RecyclerView.ViewHolder { public ImageView img; public TextView title; public TextView price; public SearchRecyclerHolder(View itemView) { super(itemView); img = (ImageView) itemView.findViewById(R.id.img); price = (TextView) itemView.findViewById(R.id.price); title = (TextView) itemView.findViewById(R.id.title); } }
//适配器 抽取接口
public interface OnItemClickListner { public void onItemClick(int position); public void onItemLongClickListner(int position); }
import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.cuijiajum.sanzhou.R; import com.cuijiajum.sanzhou.bean.AllContent; import com.cuijiajum.sanzhou.holder.SearchRecyclerHolder; import com.bumptech.glide.Glide; import java.util.List; public class SearchRecyclerAdapter extends RecyclerView.Adapter<SearchRecyclerHolder> { Context context; List<AllContent.DataBean> data; private OnItemClickListner onItemClickListner; public SearchRecyclerAdapter(Context context, List<AllContent.DataBean> data) { this.context = context; this.data = data; } @Override public SearchRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); SearchRecyclerHolder searchRecyclerHolder = new SearchRecyclerHolder(view); return searchRecyclerHolder; } @Override public void onBindViewHolder(SearchRecyclerHolder holder, final int position) { AllContent.DataBean dataBean = data.get(position); String images = dataBean.getImages(); String[] split = images.split("\\|"); //设置数据 Glide.with(context).load(split[0]).into(holder.img); holder.price.setText("¥"+dataBean.getPrice()+""); holder.title.setText(dataBean.getTitle()); holder.title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onItemClickListner.onItemClick(position); } }); } @Override public int getItemCount() { return data.size(); } public void setOnitemClickListner(OnItemClickListner onItemClickListner) { this.onItemClickListner = onItemClickListner; //onItemClickListner.onItemClick(); } }
package com.cuijiajum.sanzhou.adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.cuijiajum.sanzhou.R; import com.cuijiajum.sanzhou.bean.AllContent; import com.cuijiajum.sanzhou.holder.SearchRecyclerHolder; import com.bumptech.glide.Glide; import java.util.List; public class SearchRecyclerGVAdapter extends RecyclerView.Adapter<SearchRecyclerHolder> { Context context; List<AllContent.DataBean> data; private OnItemClickListner onItemClickListner; public SearchRecyclerGVAdapter(Context context, List<AllContent.DataBean> data) { this.context = context; this.data = data; } @Override public SearchRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false); SearchRecyclerHolder searchRecyclerHolder = new SearchRecyclerHolder(view); return searchRecyclerHolder; } @Override public void onBindViewHolder(SearchRecyclerHolder holder, final int position) { AllContent.DataBean dataBean = data.get(position); String images = dataBean.getImages(); String[] split = images.split("\\|"); //设置数据 Glide.with(context).load(split[0]).into(holder.img); holder.price.setText("¥"+dataBean.getPrice()+""); holder.title.setText(dataBean.getTitle()); holder.title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onItemClickListner.onItemClick(position); } }); } @Override public int getItemCount() { return data.size(); } public void setOnitemClickListner(OnItemClickListner onItemClickListner) { this.onItemClickListner = onItemClickListner; //onItemClickListner.onItemClick(); } }
//布局方法
//main布局
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:text="《"/> <EditText android:layout_weight="5" android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/name" android:singleLine="true" android:hint="最新上市,内衣三免一,服装免费送秩序1分钱"/> <Button android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" android:text="搜索" android:onClick="add" android:layout_gravity="center" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24dp" android:text="热搜"/> <com.cuijiajum.sanzhou.Liushi android:id="@+id/ls" android:layout_width="match_parent" android:layout_height="80dp"> </com.cuijiajum.sanzhou.Liushi> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="历史记录" android:textSize="24dp"/> <ListView android:layout_width="match_parent" android:layout_height="200dp" android:id="@+id/lv"></ListView> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="清空历史记录" android:layout_gravity="center" android:gravity="center" android:onClick="delall" android:visibility="invisible" android:id="@+id/btn" />
//search页面
<RelativeLayout android:layout_width="match_parent" android:layout_height="60dp" android:padding="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索商品" android:textSize="35dp" android:layout_centerInParent="true"/> <CheckBox android:button="@null" android:layout_width="30dp" android:layout_height="30dp" android:id="@+id/ck" android:background="@drawable/myselect" android:layout_alignParentRight="true" /> </RelativeLayout> <TextView android:background="#f1ebeb" android:layout_width="match_parent" android:layout_height="3dp"/> <TextView android:background="#f1ebeb" android:layout_width="match_parent" android:layout_height="3dp"/> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content">
//goods商品详情界面
<com.youth.banner.Banner android:id="@+id/mbanner" android:layout_width="match_parent" android:layout_height="400dp"> </com.youth.banner.Banner> <LinearLayout android:layout_below="@+id/mbanner" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/title_goods" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="dsfsdfsdf " android:textSize="25sp" android:layout_margin="10dp"/> <TextView android:id="@+id/price_01_goods" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="dsfsdfsdf " android:textSize="25sp" android:layout_margin="10dp"/> <TextView android:id="@+id/price_02_goods" android:textColor="#f00" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25sp" android:text="dsfsdfsdf " android:layout_margin="10dp"/> </LinearLayout> <Button android:textSize="30sp" android:layout_alignParentBottom="true" android:onClick="add_gouwuche" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="添加数据库"/>
//适配器需要加载的界面
//条目布局
<ImageView android:id="@+id/img" android:layout_width="100dp" android:layout_height="100dp" android:src="@mipmap/ic_launcher"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/title" android:text="bbbbbbbbb" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> <TextView android:id="@+id/price" android:text="aaaaa" android:textColor="#f00" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout>
//适配器表格布局
<ImageView android:id="@+id/img" android:layout_width="180dp" android:layout_height="180dp" android:src="@mipmap/ic_launcher"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/title" android:text="bbbbbbbbb" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> <TextView android:id="@+id/price" android:text="aaaaa" android:textColor="#f00" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout>
相关文章推荐
- FlowLayout流式布局实现搜索清空历史记录
- 简单实现Android搜索功能 显示清除历史搜索记录
- Android流式布局实现历史搜索记录功能
- [置顶] Android流式布局实现历史搜索记录
- 流失布局 搜索显示 历史记录Listview显示
- 框架 day81 涛涛商城项目-实现首页搜索功能,商品详情,描述,规格展示
- 简单实现Android搜索功能 显示清除历史搜索记录
- Android开源库:手把手教你实现一个简单好用的搜索框(含历史搜索记录)
- 搜索历史记录流式布局展示
- 搜索添加历史记录和商品详情
- 【iOS】一种仿京东搜索历史记录的表格的实现(sqlite3的使用)
- ioS开发之UI基础--使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
- Android用AutoCompleteTextView实现搜索历史记录提示
- html5实现 搜索历史记录【轻松搞定】
- 使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
- 淘淘商城系列——实现商品详情页面展示
- 学习淘淘商城第六十四课(实现商品详情页面展示)
- iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
- Android项目类似淘宝 电商 搜索功能,监听软键盘搜索事件,延迟自动搜索,以及时间排序的搜索历史记录的实现