1、布局文件Listview

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context=".WriteAndReadActivity">

<android.support.constraint.Guideline
android:id="@+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.8" />

<android.support.constraint.Guideline
android:id="@+id/guideline5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.9" />

<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="返回"
app:layout_constraintBottom_toTopOf="@+id/guideline5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline5" />

<ScrollView
android:id="@+id/scrollView2"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/guideline3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp" />
</LinearLayout>
</ScrollView>

</android.support.constraint.ConstraintLayout>


2、listview_item布局文件

<?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:padding="10dp"
android:minHeight="100dp"
>

<TextView
android:id="@+id/textView_list_item_id"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text=""
/>
<TextView
android:id="@+id/textView_list_item_epc"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="10sp"
android:text=""
/>
<TextView
android:id="@+id/textView_list_item_sku"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:textSize="10sp"
android:text=""
/>

<TextView
android:id="@+id/textView_list_item_filename"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="文件名"
android:gravity="center"
android:textSize="10sp"
/>

<TextView
android:id="@+id/textView_list_item_state"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="状态"
android:gravity="center"
android:textSize="10sp"
/>

<Button
android:id="@+id/textView_list_btn_read"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="读"
android:layout_weight="1" />

<Button
android:id="@+id/textView_list_btn_write"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="写"
android:layout_weight="1" />



</LinearLayout>


3、Activity

package com.example.uhftopdf;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import com.example.uhftopdf.com.ReadWriteAdapter;
import com.example.uhftopdf.com.bean.CabinetInfo;
import com.example.uhftopdf.com.db.DatabaseAccess;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WriteAndReadActivity extends AppCompatActivity {

private static final String TAGNAME = "WriteAndReadActivity";
private Button btn;
private ListView lv;
private DatabaseAccess dao;
private ArrayList<Map<String, Object>> listMap;
private List<CabinetInfo> cabinetInfos;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_write_and_read);

btn = findViewById(R.id.button5);

lv = findViewById(R.id.listView);

dao = DatabaseAccess.getInstance(WriteAndReadActivity.this);
cabinetInfos = dao.getAll();
Log.e(TAGNAME,"----------11111-------epc=:"+cabinetInfos.size());
show();

lv.setOnItemClickListener(new ReadWriterItemClickListener());

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(WriteAndReadActivity.this,MainActivity.class);
startActivity(intent);
}
});

}



@Override
protected void onDestroy() {
super.onDestroy();
}


private void show() {
ReadWriteAdapter adapter = new ReadWriteAdapter(this,cabinetInfos,R.layout.listview_item,dao);
lv.setAdapter(adapter);
}

public class ReadWriterItemClickListener implements AdapterView.OnItemClickListener
{

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ListView lView = (ListView)parent;
CabinetInfo car = (CabinetInfo)lView.getItemAtPosition(position);
// Toast.makeText(getApplicationContext(),p.getName(),0).show();
}
}




}


4、java bean

package com.example.uhftopdf.com.bean;

public class CabinetInfo {
public static final String EPC = "epc";
public static final String SKU = "sku";
public static final String ID = "id";
public static final String FILENAME = "filename";
public static final String SAVEPATH = "savepath";
public static final String STATE = "state";

private String id;
private String epc;
private String sku;
private String state;
private String filename;
private String savePath;

public CabinetInfo() {
}

public CabinetInfo(String id,String filename,String epc, String sku,String savePath, String state ) {
this.epc = epc;
this.sku = sku;
this.id = id;
this.filename = filename;
this.savePath = savePath;
this.state = state;
}

public CabinetInfo(String epc, String sku, String state, String filename, String savePath) {
this.epc = epc;
this.sku = sku;
this.filename = filename;
this.savePath = savePath;
this.state = state;
}

public String getEPC() {
return epc;
}

public String getSKU() {
return sku;
}

public String getID() {
return id;
}

public String getFILENAME() {
return filename;
}

public String getSavePath() {
return savePath;
}

public void setSavePath(String savePath) {
this.savePath = savePath;
}

public String getSTATE() {
return state;
}

public String getEpc() {
return epc;
}

public void setEpc(String epc) {
this.epc = epc;
}

public String getSku() {
return sku;
}

public void setSku(String sku) {
this.sku = sku;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getFilename() {
return filename;
}

public void setFilename(String filename) {
this.filename = filename;
}

public void setState(String state) {
this.state = state;
}

@Override
public String toString() {
return "CabinetInfo{" +
"id='" + id + '\'' +
", epc='" + epc + '\'' +
", sku='" + sku + '\'' +
", state='" + state + '\'' +
", filename='" + filename + '\'' +
", savePath='" + savePath + '\'' +
'}';
}
}


5、MySqliteOpenHelper

package com.example.uhftopdf.com.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class MySqliteOpenHelper extends SQLiteOpenHelper {
public static final int DB_VERSION = 22;
public static final String DB_NAME = "Store_CabinetInfo.db";
public final static String TB_TAGINFO = "tb_taginfo";
public final static String TB_EPC = "tb_epc";
public MySqliteOpenHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
CREATE(db);
CREATETableEPC(db);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

public void CREATE(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS tb_taginfo(id integer primary key autoincrement,filename varchar(60),epc varchar(60),sku varchar(60),savepath varchar2(120),state varchar(5))");
}

public void CREATETableEPC(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS tb_epc(id integer primary key autoincrement,sku char(24),epc char(32),serNum int)");
}
}


6、DatabaseAccess

package com.example.uhftopdf.com.db;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.uhftopdf.com.bean.CabinetInfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DatabaseAccess {
private final List<String> TAGUID = new ArrayList<String>();
private final List<String> SERVICEUID = new ArrayList<String>();
private final List<String> SERVICESKU = new ArrayList<String>();
private final StringBuffer DATA = new StringBuffer();
private Map<String, Integer> map_sku = new HashMap();
boolean su;
private static MySqliteOpenHelper mSqliteOpenHelper;
private SQLiteDatabase db;
private static DatabaseAccess dbAccess;
private static Context mcontext;

public static synchronized DatabaseAccess getInstance(Context context) {
if (dbAccess == null) {
mcontext = context;
dbAccess = new DatabaseAccess(context);
mSqliteOpenHelper = new MySqliteOpenHelper(context, MySqliteOpenHelper.DB_NAME, null, MySqliteOpenHelper.DB_VERSION);
}
return dbAccess;
}

private DatabaseAccess(Context context) {
}

public synchronized void close() {
if (db != null && db.isOpen()) {
db.close();
}
if (mSqliteOpenHelper != null) {
mSqliteOpenHelper.close();
}
}

public void clearn() {
map_sku.clear();
SERVICESKU.clear();
TAGUID.clear();
SERVICEUID.clear();
DATA.delete(0, DATA.length());
}



public synchronized long InsertInfoToDB( String epc, String sku, String state, String filename,String savePath) {
db = mSqliteOpenHelper.getWritableDatabase();
ContentValues values = new ContentValues();

values.put(CabinetInfo.EPC, epc);
values.put(CabinetInfo.SKU, sku);
values.put(CabinetInfo.STATE, state);
values.put(CabinetInfo.FILENAME, filename);
values.put(CabinetInfo.SAVEPATH, savePath);
long rows = db.insert(MySqliteOpenHelper.TB_TAGINFO, null, values);
return rows;
}


public synchronized int upgradetoryInfoToDB( String epc, String state) {
ContentValues values = new ContentValues();

values.put(CabinetInfo.STATE, state);

int rows = db.update(MySqliteOpenHelper.TB_TAGINFO, values, "EPC=?", new String[]{epc});
return rows;
}

public String getCount(String epc) {
String count = "";
Cursor cursor = null;
try {
db = this.mSqliteOpenHelper.getWritableDatabase();

cursor = db.rawQuery("select * from TB_TAGINFO where epc=?", new String[]{ epc});

// cursor = db.query(MySqliteOpenHelper.TB_TAGINFO, new String[]{"inventoryNum", "sku"}, "inventoryNum=? and sku=?", new String[]{SetOdd_Numbers, sku}, null, null, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
count = cursor.getString(cursor.getColumnIndex("epc"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
return count;
}


public synchronized boolean AllDataIsRepeat(String epc) {
su = false;
Cursor cursor = null;
try {
db = this.mSqliteOpenHelper.getWritableDatabase();
cursor = db.query(MySqliteOpenHelper.TB_TAGINFO, new String[]{"epc"}, "epc=?", new String[]{epc}, null, null, null);
if (cursor != null && cursor.moveToNext()) {
su = true;
} else {
su = false;
}
} catch (Exception e) {
// TODO: handle exception
} finally {
if (cursor != null) {
cursor.close();
}
}
return su;
}

/**
* 删除整个数据库
*
* @return
*/
public synchronized int delAllFromTAGINFO() {
db = mSqliteOpenHelper.getWritableDatabase();
int num = db.delete(MySqliteOpenHelper.TB_TAGINFO, null, null);
return num;
}

public synchronized int delFromTAGINFO(String epc) {
db = mSqliteOpenHelper.getWritableDatabase();
int num = db.delete(MySqliteOpenHelper.TB_TAGINFO, "epc=?", new String[]{epc});
return num;
}


public synchronized List<CabinetInfo> getAll() {
List<CabinetInfo> infoList = new ArrayList<>();

db = mSqliteOpenHelper.getWritableDatabase();
String sql = "select * from " + MySqliteOpenHelper.TB_TAGINFO ;
Cursor cursor = db.rawQuery(sql, null);

if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String id = cursor.getString(0);
String filename = cursor.getString(1);
String epc = cursor.getString(2);
String sku = cursor.getString(3);
String savepath = cursor.getString(4);
String state = cursor.getString(5);

CabinetInfo info = new CabinetInfo(id,filename, epc, sku, savepath, state);
infoList.add(info);
}
}
if (cursor != null)
cursor.close();
return infoList;
}

public synchronized CabinetInfo getCabByEpc(String epc) {

db = mSqliteOpenHelper.getWritableDatabase();
String sql = "select * from " + MySqliteOpenHelper.TB_TAGINFO +" where epc='"+epc+"'";
Cursor cursor = db.rawQuery(sql, null);

if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String id = cursor.getString(0);
String filename = cursor.getString(1);
String tempEpc = cursor.getString(2);
String sku = cursor.getString(3);
String savepath = cursor.getString(4);
String state = cursor.getString(5);

CabinetInfo info = new CabinetInfo(id,filename, tempEpc, sku, savepath, state);
return info;
}
}
if (cursor != null)
cursor.close();
return null;
}

public synchronized CabinetInfo getCabBySku(String sku) {

db = mSqliteOpenHelper.getWritableDatabase();
String sql = "select * from " + MySqliteOpenHelper.TB_TAGINFO +" where sku='"+sku+"'";
Cursor cursor = db.rawQuery(sql, null);

if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String id = cursor.getString(0);
String filename = cursor.getString(1);
String tempEpc = cursor.getString(2);
String strSku = cursor.getString(3);
String savepath = cursor.getString(4);
String state = cursor.getString(5);

CabinetInfo info = new CabinetInfo(id,filename, tempEpc, strSku, savepath, state);
return info;
}
}
if (cursor != null)
cursor.close();
return null;
}
}


7、ReadWriteAdapter

package com.example.uhftopdf.com;

import android.content.Context;
import android.graphics.Color;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.android.hdhe.uhf.reader.UhfReader;
import com.android.hdhe.uhf.readerInterface.TagModel;
import com.example.uhftopdf.MainActivity;
import com.example.uhftopdf.R;
import com.example.uhftopdf.com.bean.CabinetInfo;
import com.example.uhftopdf.com.db.DatabaseAccess;
import com.example.uhftopdf.com.util.SoundUtil;
import com.example.uhftopdf.com.util.StringUtil;

import java.io.File;
import java.util.List;
import java.util.Map;

import cn.pda.serialport.Tools;

public class ReadWriteAdapter extends BaseAdapter {


public static final String PWD = "00000000";
public int membank = UhfReader.MEMBANK_EPC;
private int addr = 2;// begin address
private List<CabinetInfo> cabinetInfos;
private int resource;
private LayoutInflater inflater;
private Context context;

private UhfReader manager;
private String readEpc;
private int length = 8;
private DatabaseAccess dao;

public ReadWriteAdapter(Context context,List<CabinetInfo> cabinetInfos, int resource) {
this.context = context;
this.cabinetInfos = cabinetInfos;
this.resource = resource;
manager = UhfReader.getInstance();
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public ReadWriteAdapter(Context context,List<CabinetInfo> cabinetInfos, int resource,DatabaseAccess dao) {
this.context = context;
this.cabinetInfos = cabinetInfos;
this.resource = resource;
this.dao = dao;
manager = UhfReader.getInstance();
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return cabinetInfos.size();
}

@Override
public Object getItem(int position) {
return cabinetInfos.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null)
{
convertView = inflater.inflate(resource,null);
}
TextView idView = (TextView)convertView.findViewById(R.id.textView_list_item_id);
TextView epcView = (TextView)convertView.findViewById(R.id.textView_list_item_epc);
TextView filenameView = (TextView)convertView.findViewById(R.id.textView_list_item_filename);
TextView skuView = (TextView)convertView.findViewById(R.id.textView_list_item_sku);
TextView stateView = (TextView)convertView.findViewById(R.id.textView_list_item_state);
Button readBtn = (Button)convertView.findViewById(R.id.textView_list_btn_read);
Button writeBtn = (Button)convertView.findViewById(R.id.textView_list_btn_write);


final CabinetInfo p = cabinetInfos.get(position);
final int pos = position;
idView.setText((position+1)+"");
epcView.setText(p.getEPC());
filenameView.setText(p.getFilename());
skuView.setText(p.getSku());
Log.d("Test", "----------------p.getSTATE()---------------"+p.getSTATE());
if("0".equals(p.getSTATE())){
stateView.setTextColor(Color.RED);
stateView.setText("未写" );
}else{
stateView.setTextColor(Color.GREEN);
stateView.setText( "已写");
}

//读操作
readBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Toast.makeText(context,"读",Toast.LENGTH_SHORT).show();
read();
}
});

//写操作
writeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Toast.makeText(context,"写",Toast.LENGTH_SHORT).show();
String epc = p.getEPC();
Log.d("Test", "----------------epc---------------"+epc);
write(p.getEPC(),pos);
}
});


return convertView;
}

private void read(){
byte[] accessPassword = Tools.HexString2Bytes(PWD);

byte[] data = manager.readFrom6C(membank, addr, length, accessPassword);
Log.e("Test","-----------------manager=:"+manager);
Log.e("Test","----------11111-------data=:"+data);
Log.e("Test","----------11111-------(data != null )=:"+(data != null ));
Log.e("Test","----------11111-------(data.length > 1)=:"+( data.length > 1));
Log.e("Test","----------11111-------(data != null && data.length > 1)=:"+(data != null && data.length > 1));
if (data != null && data.length > 1) {
readEpc = Tools.Bytes2HexString(data, data.length);
Toast.makeText(context,readEpc,Toast.LENGTH_LONG).show();
}else{
// Toast.makeText(context,readEpc,Toast.LENGTH_LONG).show();
Toast.makeText(context,"读取失败",Toast.LENGTH_LONG).show();
}

}

private void write(String epc,int position){
if(readEpc==null || "".equals(readEpc)){
Toast.makeText(context,"请先扫描标签",Toast.LENGTH_LONG).show();
return;
}
Log.d("Test", "----------------readEpc---------------"+readEpc);
Log.e("Test","-----------------manager=:"+manager);
manager.selectEPC(Tools.HexString2Bytes(readEpc));
byte[] accessPassword = Tools.HexString2Bytes(PWD);
if (accessPassword.length != 4) {
Toast.makeText(context,"写入密码错误",Toast.LENGTH_LONG).show();
return;
}
String writeData = epc;
Log.d("Test", "----------------writeData---------------"+writeData);
if (writeData.length() % 4 != 0) {
Toast.makeText(context,"写入数据字节数错误",Toast.LENGTH_LONG).show();
return;
}
byte[] dataBytes = Tools.HexString2Bytes(writeData);
// dataLen = dataBytes/2 dataLen
Log.d("Test", "----------------accessPassword---------------"+accessPassword);
Log.d("Test", "----------------membank---------------"+membank);
Log.d("Test", "----------------addr---------------"+addr);
boolean writeFlag = manager.writeTo6C(accessPassword, membank,
addr, dataBytes.length / 2, dataBytes);

if (writeFlag) {

CabinetInfo cab = cabinetInfos.get(position);
dao.upgradetoryInfoToDB(writeData,"1");
cab.setState("1");
update(position, cab);
Toast.makeText(context,"写入成功",Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context,"写入失败",Toast.LENGTH_LONG).show();
}
}


//实时更新ListView数据
private void update(int position,CabinetInfo cabinetInfo){
cabinetInfos.set(position,cabinetInfo);
this.notifyDataSetChanged();
}



}