helper类
package com.example.administrator.weekone.sqlhelper;
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, "mydb", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table flow(id Integer primary key autoincrement , name text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
dao层
package com.example.administrator.weekone.dao;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.widget.Toast;
import com.example.administrator.weekone.sqlhelper.MyHelper;
import java.util.ArrayList;
public class MyDao {
private MyHelper helper;
private SQLiteDatabase database;
private Context mcontext;
public MyDao(Context context) {
mcontext = context;
helper = new MyHelper(context);
database = helper.getWritableDatabase();
}
//查询的方法
public ArrayList<String> show() {
ArrayList<String> datas = new ArrayList<>();
Cursor cursor = database.query("flow", null, null, null, null, null, null, null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
datas.add(name);
}
return datas;
}
//添加数据的方法
public void insertall(String name) {
ContentValues values = new ContentValues();
values.put("name", name);
database.insert("flow", null, values);
Toast.makeText(mcontext, "添加成功", Toast.LENGTH_SHORT).show();
}
//删除数据的方法
public void delete() {
database.execSQL("delete from flow");
}
}
自定义控件 ---------头部布局
package com.example.administrator.weekone.myview;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.administrator.weekone.R;
public class MyXHView extends LinearLayout {
private EditText My_Search;
private TextView My_Add;
public MyXHView(Context context, AttributeSet attrs) {
super(context, attrs);
//引入头部布局
LayoutInflater.from(context).inflate(R.layout.my_hander, this);
//查找控件
My_Search = findViewById(R.id.My_Search);
My_Add = findViewById(R.id.My_Add);
}
//获取输入框中的值
public String getSearch() {
return My_Search.getText().toString().trim();
}
//按钮点击后返回的值
public TextView getAdd() {
return My_Add;
}
//对editText进行操作
public EditText getEdit() {
return My_Search;
}
}
头部布局的xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<EditText
android:id="@+id/My_Search"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="6"
android:drawableLeft="@drawable/tb"
android:background="@drawable/myedit"
android:drawablePadding="5dp"
android:hint="搜索" />
<TextView
android:id="@+id/My_Add"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="添加" />
</LinearLayout>
自定义view流式布局
package com.example.administrator.weekone.myview;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.administrator.weekone.R;
import java.util.ArrayList;
public class MyView extends LinearLayout {
private int mwidthPixels;
private String mcolor;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
//获取屏幕的尺寸与密度
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
//像素宽度
mwidthPixels = metrics.widthPixels;
//设置这个布局垂直显示(此处注意需要继承的是线性布局,如果不是出不来)
setOrientation(VERTICAL);
//获得样式属性
TypedArray myarray = context.obtainStyledAttributes(attrs, R.styleable.GroupDemo);
//进行判断
if (myarray != null) {
//如果不为空就获得样式
mcolor = (String) myarray.getText(R.styleable.GroupDemo_textColor);
//将资源回收
myarray.recycle();
}
}
//删除的方法
public void removeChildView() {
//删除所有的子控件
removeAllViews();
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
}
//添加数据
public void setData(ArrayList<String> datas) {
//创建一个线性布局对象
LinearLayout linearLayout = getLinear();
//进行for循环
for (int i = 0; i < datas.size(); i++) {
//获取文字
final String tmp = datas.get(i);
//初始化宽度
int numWidth = 0;
//得到每一行的linearlayout到底有多少个子控件,需要计算总宽度
int childCount = linearLayout.getChildCount();
//进行for循环,计算一行的宽度
for (int j = 0; j < childCount; j++) {
//通过循环的到每一个子控件
TextView tv_chang = (TextView) linearLayout.getChildAt(j);
//layoutParams布局参数 获取布局参数
LayoutParams layoutParams = (LayoutParams) tv_chang.getLayoutParams();
//设定每一个控件的外边距
int aleftMargin = layoutParams.leftMargin;
//测量这个textview的宽度
tv_chang.measure(getMeasuredWidth(), getMeasuredHeight());
//将得到的宽度相加 字体本身的宽度+左外边距+左边的填充+右边的填充
numWidth += tv_chang.getMeasuredWidth() + aleftMargin + tv_chang.getPaddingLeft() + tv_chang.getPaddingRight();
}
//获得text对象
TextView text = getText();
//设置一个点击事件,再点击条目的时候进行吐司展示
text.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), tmp, Toast.LENGTH_SHORT).show();
}
});
//设置属性
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
//给params设置具体的数值;
params.leftMargin = 15;
params.topMargin = 10;
//设定文字的属性
text.setLayoutParams(params);
//将文字进行传入
text.setText(tmp);
//测量输入的值的高与宽
text.measure(getMeasuredWidth(), getMeasuredHeight());
//得到输入值总宽度
int textNumWidth = text.getMeasuredWidth() + text.getPaddingLeft() + text.getPaddingRight();
//设定 一个判断条件,如果某个字符串特别长超出了屏幕的总宽度
if (textNumWidth > mwidthPixels) {
//如果文字过长就进行一个截取字符串
String s = tmp.substring(0, 6);
text.setText(s + "...");
text.measure(getMeasuredWidth(), getMeasuredHeight());//截取完毕后再重新测量宽高
textNumWidth = text.getMeasuredWidth();//得到宽度
}
//进行判断
if (mwidthPixels >= numWidth + textNumWidth) {
linearLayout.addView(text);//添加新的控件
} else {
//此处给LinearLayout重新赋值,通过getLinear换行
linearLayout = getLinear();
linearLayout.addView(text);
}
}
}
//初始化子线性布局视图
private LinearLayout getLinear() {
//创建一个控件对象
LinearLayout linearLayout = new LinearLayout(getContext());
//使用LayoutParams 用来控制组件的大小
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
linearLayout.setLayoutParams(params);//将属性值添加到控件
//this本类对象
this.addView(linearLayout);//此处只要重新添加视图了就自动换行
return linearLayout;//返回控件
}
//初始化文字
private TextView getText() {
//创建一个textview对象
TextView textView = new TextView(getContext());
//设定字体大小
textView.setTextSize(20);
//设定字体颜色
textView.setTextColor(Color.parseColor(mcolor));
//设定背景颜色
textView.setBackgroundResource(R.drawable.text_view);
//设定每个搜索的间隔
textView.setPadding(10, 3, 10, 3);
//返回文字
return textView;
}
}
实现圆角搜索框用的shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="#f4e00b" />
<corners android:radius="15dp" />
<gradient
android:endColor="#aaa"
android:startColor="#aaa" />
</shape>
流式布局字体用的代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="#F5F6F9" />
<corners android:radius="15dp" />
</shape>
attrs里面的代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="GroupDemo">
<attr name="textColor" format="string" />
</declare-styleable>
</resources>
Activity的xml里面的代码
<?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:background="#55d7d1"
android:orientation="vertical"
tools:context=".MainActivity">
<!--自定义标题栏-->
<com.example.administrator.weekone.myview.MyXHView
android:id="@+id/My_Header"
android:layout_width="match_parent"
android:layout_height="80dp"></com.example.administrator.weekone.myview.MyXHView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="搜索历史" />
<TextView
android:id="@+id/My_del"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:drawableLeft="@drawable/sc"/>
</RelativeLayout>
<com.example.administrator.weekone.myview.MyView
android:id="@+id/My_History"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:textColor="@color/colorPrimaryDark"></com.example.administrator.weekone.myview.MyView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="热门搜索" />
<com.example.administrator.weekone.myview.MyView
android:id="@+id/My_Hot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:textColor="@color/colorPrimaryDark"></com.example.administrator.weekone.myview.MyView>
</LinearLayout>
activity的代码
package com.example.administrator.weekone;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.example.administrator.weekone.dao.MyDao;
import com.example.administrator.weekone.myview.MyView;
import com.example.administrator.weekone.myview.MyXHView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private String[] data = {"性感", "美女", "丰满", "御姐", "萝莉", "艾滋病", "梅毒", "性感", "美女", "丰满", "御姐", "萝莉", "艾滋病", "梅毒", "性感", "美女", "丰满", "御姐", "萝莉", "艾滋病", "梅毒"};
private MyXHView My_Header;
private MyView My_History;
private MyView My_Hot;
private MyDao myDao;
private ArrayList<String> datas = new ArrayList<>();
private ArrayList<String> mhistoryjihe = new ArrayList<>();
private TextView My_del;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDao = new MyDao(this);
mhistoryjihe = myDao.show();
//初始化数据
initData();
initView();
//进行一个判断
if (!mhistoryjihe.isEmpty()) {
//将默认数据直接从数据库添加到集合中
My_History.setData(mhistoryjihe);
}
}
//初始化数据
private void initData() {
for (int i = 0; i < data.length; i++) {
datas.add(data[i]);
}
}
//初始化控件
private void initView() {
My_Header = (MyXHView) findViewById(R.id.My_Header);
My_Header.getAdd().setOnClickListener(this);
My_History = (MyView) findViewById(R.id.My_History);
My_Hot = (MyView) findViewById(R.id.My_Hot);
My_Hot.setData(datas);
My_del = (TextView) findViewById(R.id.My_del);
My_del.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.My_Add:
String name = My_Header.getSearch().trim();
//进行一个费控判断
if (name != null && name.equals("")) {
Toast.makeText(this, "输入为空", Toast.LENGTH_SHORT).show();
} else {
myDao.insertall(My_Header.getSearch().trim());
//自己封装一个删除子控件
My_History.removeChildView();
//将数据添加到集合中
mhistoryjihe.add(name);
My_History.setData(mhistoryjihe);
//添加完毕后进行一个输入框赋空
My_Header.getEdit().setText("");
}
break;
case R.id.My_del:
//删除数据库
myDao.delete();
//删除输入历史
My_History.removeChildView();
//对数据集合进行清空
mhistoryjihe.clear();
break;
}
}
}
以上,如果有什么不对的地方,请私信;