相关文章推荐
很酷的手套  ·  MySQL ...·  3 年前    · 
千杯不醉的西装  ·  Spring ...·  3 年前    · 
读研的面包  ·  java - ...·  3 年前    · 
  • 本程序在 android 5.0.1 基础上开发的,对于android低版本很可能不适用。
  • 要求最小版本为 android4.2,对应API为 API17
  • 代码在 Eclipse 这款IDE上开发的,android studio平台也可以使用
  • 本程序保证真实有效!

res/layout 下的布局文件

1,activity_main.xml 窗体布局文件

<




    
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#f0aea9" >
        <TextView
            android:id="@+id/id"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:text="ID"
            android:textColor="#ff890e"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/name"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:text="商品"
            android:textColor="#ff890e"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/price"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:text="价格"
            android:textColor="#ff890e"
            android:textSize="20sp" />
    </LinearLayout>
    <ListView
        android:id="@+id/goodList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>
</LinearLayout>

2,add_modify.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="vertical">  
    <EditText
        android:text="" 
        android:id="@+id/inputName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="商品名"
        android:textSize="20sp" />
    <EditText
        android:text="" 
        android:id="@+id/inputPrice"  
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:hint="售价"/>
    <LinearLayout 
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/linearLayout1">
        <Button
            android:id="@+id/concel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text=




    
"取消" />  
        <Button 
            android:layout_weight="1"
            android:id="@+id/confirm"
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" />  
    </LinearLayout>  
</LinearLayout>

3,list_item.xml 记录布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
        <TextView
            android:id="@+id/item_id"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:textColor="#26a0da"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/item_name"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:textColor="#26a0da"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/item_price"
            android:layout_width="0sp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:textColor="#26a0da"
            android:textSize="20sp" />
</LinearLayout>

包下的java源文件

1,DBHelper.java 数据库操作的帮助类

package com.example.sy7_3;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
	// 数据库创建语句
	private static String CREATE_TABLE_SQL = "create table IF NOT EXISTS goods(_ID integer primary key autoincrement, GOODS_NAME text, GOODS_PRICE integer)";
	// 构造函数:实例化时,创建数据库
	public DBHelper(Context context) {
		super(context, "goods.db", null, 1);
	// 实例化对象时自动创建数据库
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_TABLE_SQL);
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}	

2,good.java 封装商品对象信息的类

package com.example.sy7_3;
import android.R.integer;
// 封装商品类
public class good {
	// ID、商品名、商品价格
	private String _id;
	private String name;
	private String price;	
	// 对应的get set方法
	public String get_id() {
		return _id;
	public void set_id(String _id) {
		this._id = _id;
	public String getName() {
		return name;
	public void setName(String name) {
		this.name = name;
	public String getPrice() {
		return price;
	public void setPrice(String price) {
		this.price = price;
	public String toString() {
		return _id + ", " + name + ", " + price;
	// 构造函数
	public good(String _id, String name, String price) {
		super();
		this._id = _id;
		this.name = name;
		this.price = price;

3,MainActivity.java 主窗体源文件

package com.example.sy7_3;
import java.util.ArrayList;
import java.util.




    
List;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
	// 增加、修改弹窗
	private PopupWindow popWindow;
	// 存储商品对象的列表
	private List<good> goodList;
	// 数据库对象
	private SQLiteDatabase database;
	// 操作数据库的帮助类
	private DBHelper dbHelper;
	// 适配器
	private MyAdapter myAdapter;
	ListView lv;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 获取ListView控件
		ListView lv = (ListView) findViewById(R.id.goodList);
		// 存储商品对象的列表
		goodList = new ArrayList<good>();
		// 创建MyOpenHelper实例对象,用于操作数据库
		dbHelper = new DBHelper(this);
		// 数据库写对象
		database = dbHelper.getWritableDatabase();
		// 查询所有数据,并存入goodList中
		Query(null);
		// 创建MyAdapter实例
		myAdapter = new MyAdapter(this);
		// 向 控件添加 Adapter
		lv.setAdapter(myAdapter);
		// 给lv注册上下文菜单
		this.registerForContextMenu(lv);
	// 定义一个容器
	class ViewHolder {
		private TextView txt_id;
		private TextView txt_name;
		private TextView txt_price;
	// 插入指定数据
	public void Insert(String name, String price) {
		ContentValues values = new ContentValues();
		values.put("GOODS_NAME", name);
		values.put("GOODS_PRICE", price);
		database.insert("goods", null, values);
	// 删除指定记录
	public void delete(int index) {
		String ID = goodList.get(index).get_id();
		database.delete("goods", "_ID =" + Integer.parseInt(ID), null);
		// 更新goodList中的数据
		Query(null);
		// 刷新ListView
		myAdapter.notifyDataSetChanged();
		DisplayToast("删除成功");
	public void Query(String DESC_NAME) {
	// 每次查询先清空goodList
	goodList.clear();
	String _id, name, price;
	good g;
	String str[] = { "%" + DESC_NAME + "%" };
	Cursor cursor = null;
	if (DESC_NAME == null) {
		cursor = database.query("goods", null, null, null, null, null, null);
	} else {
		cursor = database.query("goods", null, "GOODS_NAME" + "  LIKE ? ", str, null, null, null);
	while (cursor.moveToNext()) {
		_id = cursor.getString(0);
		name = cursor.getString(1);
		price = cursor.getString(2);
		g = new good(_id, name, price);
		goodList.add(g);
// 自定义适配器
	class MyAdapter extends BaseAdapter {
		private Context context;
		private LayoutInflater inflater;		
		public MyAdapter(




    
Context context) {
			this.context = context;
			inflater = LayoutInflater.from(context);
		@Override
		public int getCount() {
			return goodList.size();
		@Override
		public Object getItem(int position) {
			return context;
		@Override
		public long getItemId(int position) {
			return 0;
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// 从goodList取出指定位置的good对象
			good p = goodList.get(position);
			ViewHolder viewHolder = null;
			if (convertView == null) {
				viewHolder = new ViewHolder();
				convertView = inflater.inflate(R.layout.list_item, null);
				viewHolder.txt_id = (TextView) convertView.findViewById(R.id.item_id);
				viewHolder.txt_name = (TextView) convertView.findViewById(R.id.item_name);
				viewHolder.txt_price = (TextView) convertView.findViewById(R.id.item_price);
				convertView.setTag(viewHolder);
			} else {
				viewHolder = (ViewHolder) convertView.getTag();
			// 向TextView中插入数据
			viewHolder.txt_id.setText(p.get_id());
			viewHolder.txt_name.setText(p.getName());
			viewHolder.txt_price.setText(p.getPrice());
			return convertView;
	// 代码方式添加菜单项,也可以通过布局文件添加
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		menu.add(Menu.NONE, 1, 1, "增加");
		menu.add(Menu.NONE, 2, 2, "查询");
		menu.add(Menu.NONE, 3, 3, "全部记录");
		return super.onCreateOptionsMenu(menu);
	// 给lv设置上下文菜单
	@Override
	public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
		menu.add(0, 1, 0, "删除");
		menu.add(0, 2, 0, "修改");
	// 上下文菜单的响应事件
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
		long id = info.id;// 当前项的key
		int position = info.position; // 当前项在ListView中的位置
		// 删除、修改
		switch (item.getItemId()) {
		case 1:
			delete(position);
			break;
		case 2:
			updatePopup(position);
			myAdapter.notifyDataSetChanged();
			break;
		return true;
	// 更新goodlist和数据库
	public void updatePopup(final int position) {
		// 设置contentView
		View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.add_search_popup, null);
		popWindow = new PopupWindow(contentView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);
		popWindow.setContentView(contentView);
		// 显示popWindow
		View rootview = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main, null);
		popWindow.showAtLocation(rootview, Gravity.CENTER, 0, 0);
		// 设置各个控件的点击响应
		final Button concelBtn = (Button) contentView.findViewById(R.id.concel);
		final Button confirmBtn = (Button) contentView.findViewById(R.id.confirm);
		final EditText priceView = (EditText) contentView.findViewById(R.id.inputPrice)




    
;
		final EditText nameView = (EditText) contentView.findViewById(R.id.inputName);
		// 待修改的值
		nameView.setText(goodList.get(position).getName());
		priceView.setText(goodList.get(position).getPrice());
		confirmBtn.setText("修改");
		// 监听取消事件
		concelBtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				popWindow.dismiss();
		});
		// 监听确认事件
		confirmBtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				// 获取该记录的ID
				String id = goodList.get(position).get_id();
				// 修改后的值
				final String name = nameView.getText().toString().trim();
				final String price = priceView.getText().toString().trim();
				ContentValues cv = new ContentValues();
				cv.put("GOODS_NAME", name);
				cv.put("GOODS_PRICE", price);
				database.update("goods", cv, "_ID = " + id, null);
				goodList.get(position).setName(name);
				goodList.get(position).setPrice(price);
				myAdapter.notifyDataSetChanged();
				popWindow.dismiss();
		});
	// 监听菜单项,布局文件方式添加则由ID确定菜单项
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case 1:
			// 增加
			Toast.makeText(MainActivity.this, "增加", Toast.LENGTH_SHORT).show();
			//sign = 1;
			initAddSehPopupWindow(1);
			break;
		case 2:
			// 查询
			Toast.makeText(MainActivity.this, "查询", Toast.LENGTH_SHORT).show();
			//sign = 2;
			initAddSehPopupWindow(2);
			break;
		case 3:
			Query(null);
			myAdapter.notifyDataSetChanged();
		return super.onOptionsItemSelected(item);
	// 增加和查询的弹窗:通过sign标志来判断操作,true为增加、false为查询
	protected void initAddSehPopupWindow(final int sign) {
		// 设置contentView
		View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.add_search_popup, null);
		popWindow = new PopupWindow(contentView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);
		popWindow.setContentView(contentView);
		// 设置各个控件的点击响应
		final Button concelBtn = (Button) contentView.findViewById(R.id.concel);
		final Button confirmBtn = (Button) contentView.findViewById(R.id.confirm);
		final EditText priceView = (EditText) contentView.findViewById(R.id.inputPrice);
		final EditText nameView = (EditText) contentView.findViewById(R.id.inputName);
		// 查询时,不需要价格
		if (sign == 2) {
			confirmBtn.setText("查询");
			priceView.setVisibility(View.GONE);
		} else
			confirmBtn.setText("增加");
		// 给取消、确定按钮设置事件监听
		concelBtn.setOnClickListener(new OnClickListener() {
			// 直接退出
			public void onClick(View v) {
				DisplayToast("弹窗退出");
				popWindow.dismiss();
		});
		confirmBtn.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				// 记录商品名、价格
				String name = "";
				String price = "";
				// 查询操作
				if (sign == 2) {
					if (nameView == null)
						DisplayToast("未输入商品名");
					else {
						name = nameView.getText().toString().trim();
						popWindow.dismiss();
						Query(name);
						myAdapter.notifyDataSetChanged();
				// 否则进行增加
				if (sign == 1) {
					if(nameView.getText().toString() == "" || priceView.getText().toString() == "")
						DisplayToast("未输入商品名或售价");
					else {
						name = nameView.getText().toString().trim();
						price = priceView.getText().toString().trim();
						Insert(name, price);
						Query(null);
						myAdapter.notifyDataSetChanged();
						popWindow.dismiss();						
		});
		// 显示popWindow
		View rootview = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main, null);
		popWindow.showAtLocation(rootview, Gravity.CENTER, 0, 0);
	public void DisplayToast(String str) {
		Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
                    本程序在 android 5.0.1 基础上开发的,对于android低版本很可能不适用。要求最小版本为 android4.2,对应API为 API17代码在 Eclipse 这款IDE上开发的,android studio平台也可以使用本程序保证真实有效!res/layout 下的布局文件1,activity_main.xml 窗体布局文件&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android".
				
ListView与Sqlite数据库绑定步骤: 1.将Sqlite数据库的内容查询出来并放入数组列表中,形成ListView的数据源; 2.适配器绑定数据源,显示在ListView item中。 本文实现的ListView与Sqlite数据绑定的功能如下图-1 此文主要是介绍怎么使用android自带的数据库SQLite,以及把后台的数据用ListView控件显示 二、新建一个android工程——DBSQLiteOperate 工程目录: 三、清单列表AndroidManifest.xm...
apk文件下载地址:链接:https://share.weiyun.com/5p7tGNJ 全包下载地址:链接:https://share.weiyun.com/5eUc1pA 各页面主要运用 闪屏页... android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content"> &lt...
1.数据库 public class DBopenHelper extends SQLiteOpenHelper { private static final String DATA_NAME = "date.db"; private static final int VERSION = 1; public DBopenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.
activity_main.xml <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:lay