选型:
组合控件,流式布局,数据库
其中全为假数据
关于数据库的操作
package com.test3.MySqlHelp; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class Mysql extends SQLiteOpenHelper { public Mysql(Context context) { super(context, "lixinyang", null, 1); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL("create table t_shop (a varchar(20), aa varchar(11), aaa varchar(20) , aaaa varchar(20))"); sqLiteDatabase.execSQL("insert into t_shop values('羊毛衫男','新品','恒轩祥','高领')"); sqLiteDatabase.execSQL("insert into t_shop values('衬衣','新品','男长袖','保暖')"); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }
package com.test3.MySqlHelp; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.List; public class Dao { //获取帮助类对象--->通过帮助类对象得到操作数据库对象(mh.getWritableDatabase())----> SQLiteDatabase Mysql mh; public Dao(Context ctx) { super(); mh=new Mysql(ctx); //获取帮助类实例对象 } /* //执行添加操作 public void add(){ //获取SQLiteDatabase对象 SQLiteDatabase database = mh.getWritableDatabase(); //执行添加的操作 database.execSQL("insert into t_users values (?,'zhaojunchao','15110033445')"); //无返回值 //关闭数据库对象的方法 database.close(); }*/ /* //执行删除操作 public void delete(){ //获取SQLiteDatabase对象 SQLiteDatabase database = mh.getWritableDatabase(); //执行添加的操作 执行sql语句 database.execSQL("delete from t_users where _id=1"); //无返回值 //关闭数据库对象的方法 database.close(); } public List<Users> select(){ // 创建存放所有行对象集合 List<Users> us=new ArrayList<Users>(); //获取SQLiteDatabase对象 SQLiteDatabase database = mh.getWritableDatabase(); //执行查询的sql语句--->获取到结果集对象 Cursor Cursor query = database.rawQuery("select * from t_users", null); //null是为sequel语句中的占位符赋值 //是否有下一行 while(query.moveToNext()){ //获取当前行中每个列的值 int _id = query.getInt(0); String uname= query.getString(1); String tel= query.getString(2); Users u=new Users(_id, uname, tel); us.add(u); } //关闭数据库对象的方法 database.close(); return us; }*/ public List<Users> select() { // 创建存放所有行对象集合 List<Users> us = new ArrayList<Users>(); //获取SQLiteDatabase对象 SQLiteDatabase database = mh.getWritableDatabase(); //执行查询的sql语句--->获取到结果集对象 Cursor Cursor query = database.rawQuery("select * from t_shop", null); //null是为sequel语句中的占位符赋值 //是否有下一行 while (query.moveToNext()) { //获取当前行中每个列的值 String a = query.getString(0); String aa = query.getString(1); String aaa = query.getString(2); String aaaa = query.getString(3); Users u = new Users(a, aa, aaa, aaaa); us.add(u); } database.close(); return us; } public void ins(Users users){ SQLiteDatabase database = mh.getWritableDatabase(); database.execSQL("insert into t_shop values('"+users.getA()+"','"+users.getAa()+"','"+users.getAaa()+"','"+users.getAaaa()+"')"); database.close(); } public void clear(){ SQLiteDatabase database = mh.getWritableDatabase(); database.execSQL("delete from t_shop"); } }
假数据
package com.test3.MySqlHelp; public class Users { private String a; private String aa; private String aaa; private String aaaa; public Users(String a,String aa,String aaa,String aaaa) { this.a = a; this.aa = aa; this.aaa = aaa; this.aaaa = aaaa; } public String getA() { return a; } public void setA(String a) { this.a = a; } public String getAa() { return aa; } public void setAa(String aa) { this.aa = aa; } public String getAaa() { return aaa; } public void setAaa(String aaa) { this.aaa = aaa; } public String getAaaa() { return aaaa; } public void setAaaa(String aaaa) { this.aaaa = aaaa; } }
清空历史
package com.test3.Views; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.RelativeLayout; import com.test3.MainActivity; import com.test3.MySqlHelp.Dao; import com.test3.R; public class MyFooter extends RelativeLayout { public MyFooter(Context context) { this(context,null); } public MyFooter(Context context, AttributeSet attrs) { this(context, attrs,0); } public MyFooter(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); View view = LayoutInflater.from(context).inflate(R.layout.activity_footer, this,true); Button btn = view.findViewById(R.id.btn_clear); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Dao dao = new Dao(getContext()); dao.clear(); MainActivity.aa(); } }); } }
流式布局
package com.test3.Views; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import com.test3.R; public class MyText extends View { private float size; private String content; private Paint paint; private Rect rect; public MyText(Context context) { this(context,null); } public MyText(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public MyText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //获取到你控件的属性并形成数组 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.mystyle, defStyleAttr, 0); //取出里面的属性 content = ta.getString(R.styleable.mystyle_textString); size = ta.getDimension(R.styleable.mystyle_textSize, 40); //初始化画笔 paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setTextSize(size); rect = new Rect(); //第一个参数放置你的文本 // 第二个参数是你字符串开始的下标 //第三个参数是你要字符串的长度 //第四个参数返回给调用者 paint.getTextBounds(content,0,content.length(), rect); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawText(content,0, 30,paint); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //获取测量的模式和测量的尺寸 int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; //判断测量模式并将你的控件大小改变 if(widthMode==MeasureSpec.EXACTLY){ width=widthSize; }else{ int width1 = rect.width(); width=width1+getPaddingLeft()+getPaddingRight()+10; } if(heightMode==MeasureSpec.EXACTLY){ height=heightSize; }else{ int height1 = rect.height(); height = height1+getPaddingTop()+getPaddingBottom()+10; } //将屏幕宽高度从新赋值 setMeasuredDimension(width,height); } }
历史记录
package com.test3.Views; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.test3.MainActivity; import com.test3.MySqlHelp.Dao; import com.test3.MySqlHelp.Users; import com.test3.R; public class MyTitle extends RelativeLayout implements View.OnClickListener { private static EditText editText; private ImageView imageView; private TextView textView; public MyTitle(Context context) { this(context,null); } public MyTitle(Context context, AttributeSet attrs) { this(context, attrs,0); } public MyTitle(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); View view = LayoutInflater.from(context).inflate(R.layout.activity_title, this, true); editText = view.findViewById(R.id.et); imageView = view.findViewById(R.id.iv); textView = view.findViewById(R.id.tv); imageView.setOnClickListener(this); textView.setOnClickListener(this); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } @Override public boolean onTouchEvent(MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: break; } return true; } @Override public void onClick(View view) { switch(view.getId()){ case R.id.iv: Toast.makeText(getContext(),"我点了返回",Toast.LENGTH_SHORT).show(); break; case R.id.tv: Dao dao = new Dao(getContext()); String a = editText.getText().toString(); Users users = new Users(a,"新品","特别厚","挨冻"); dao.ins(users); MainActivity.aa(); break; } } public static void ss(String str){ editText.setText(str); } }
Main
package com.test3; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import com.test3.MySqlHelp.Dao; import com.test3.MySqlHelp.Users; import java.util.List; public class MainActivity extends AppCompatActivity { private static ListView lv; private static List<Users> select; private static MyAdapter adapter; private static Dao dao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); dao = new Dao(MainActivity.this); select = dao.select(); adapter = new MyAdapter(); lv.setAdapter(adapter); } class MyAdapter extends BaseAdapter{ @Override public int getCount() { return select.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if(view==null){ view=View.inflate(MainActivity.this,R.layout.activity_item,null); } TextView tv_item1 = view.findViewById(R.id.tv_item1); TextView tv_item2 = view.findViewById(R.id.tv_item2); TextView tv_item3 = view.findViewById(R.id.tv_item3); TextView tv_item4 = view.findViewById(R.id.tv_item4); tv_item1.setText(select.get(i).getA()); tv_item2.setText(select.get(i).getAa()); tv_item3.setText(select.get(i).getAaa()); tv_item4.setText(select.get(i).getAaaa()); return view; } } public static void aa(){ select = dao.select(); lv.setAdapter(adapter); adapter.notifyDataSetChanged(); } }
搜索框圆角
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <!-- <gradient 6 android:angle="45" 7 android:endColor="#CCCCCC" 8 android:startColor="#CCCCCC" /> --> <padding android:bottom="7dp" android:left="7dp" android:right="7dp" android:top="7dp" /> <!-- 设置圆角矩形 --> <corners android:radius="20dp" /> <stroke android:width="0px" android:color="#ffffff" /> <solid android:color="#F0F2F5" /> </shape>
清空历史的圆角
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <stroke android:width="0px" android:color="#000000" /> <solid android:color="#F0F2F5"></solid> <corners android:radius="20dp"/> </shape>
清空历史布局
<?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"> <Button android:layout_width="500px" android:layout_height="70px" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="清空历史记录" android:background="@drawable/buttonborder" android:id="@+id/btn_clear" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/delete" android:layout_centerVertical="true" android:layout_marginLeft="250px"/> </RelativeLayout>
历史记录后的小文字
<?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"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_item1"/> <LinearLayout android:layout_width="200px" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_alignParentRight="true"> <TextView android:background="@drawable/buttonborder" android:layout_width="0px" android:layout_weight="1" android:layout_height="wrap_content" android:id="@+id/tv_item2"/> <TextView android:background="@drawable/buttonborder" android:layout_width="0px" android:layout_weight="1" android:layout_height="wrap_content" android:id="@+id/tv_item3"/> <TextView android:background="@drawable/buttonborder" android:layout_width="0px" android:layout_weight="1" android:layout_height="wrap_content" android:id="@+id/tv_item4"/> </LinearLayout> </RelativeLayout>
主布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:Myattr="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="com.test3.MainActivity"> <com.test3.Views.MyTitle android:layout_width="wrap_content" android:layout_height="100px"></com.test3.Views.MyTitle> <TextView android:layout_width="match_parent" android:layout_height="1px" android:background="#000" /> <com.test3.Views.MyText android:layout_width="wrap_content" android:layout_height="wrap_content" Myattr:textString="热搜" Myattr:textSize="20dp"/> <com.test3.Views.MyGroupView android:layout_width="match_parent" android:layout_height="200px"> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="羊毛衫 新品" /> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="碟子" /> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="苹果8" /> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="髌骨带" /> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="胸罩" /> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="瑜伽球" /> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="超级实惠三只老鼠" /> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="冬季运动保暖裤" /> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="毛衣" /> <Button android:layout_width="wrap_content" android:layout_height="70px" android:text="加长版风衣" /> </com.test3.Views.MyGroupView> <com.test3.Views.MyText android:layout_width="wrap_content" android:layout_height="wrap_content" Myattr:textString="历史搜索" Myattr:textSize="20dp"/> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lv"></ListView> <com.test3.Views.MyFooter android:layout_width="wrap_content" android:layout_height="100px"></com.test3.Views.MyFooter> </LinearLayout>
搜索布局
<?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"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/bb" android:id="@+id/iv" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="30px"/> <EditText android:layout_width="500px" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:background="@drawable/radioimage" android:layout_centerVertical="true" android:id="@+id/et" android:gravity="center"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="80dp" android:src="@drawable/dd" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="30px" android:id="@+id/tv"/> </RelativeLayout>
自定义属性
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="textString" format="string"></attr> <attr name="textSize" format="dimension"></attr> <declare-styleable name="mystyle"> <attr name="textString"></attr> <attr name="textSize"></attr> </declare-styleable> </resources>