我正在尝试制作一种目录类型的android应用程序。目录是关于一些材料。我的想法是使用包含子行的可扩展列表视图。子行充满了可点击的文本,这些文本是材料名称,并将在警报对话框中显示材料的数据(标记,数量,轮廓,长度,重量,总重量)。材料的数据库是在数据库浏览器中创建的,并保存在Android Studio的资源文件夹中。
这是数据库表(示例):
以下是可扩展列表视图活动:
以下是代码:
DatabaseHelper.java
package com.example.sutetpedia;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class DatabaseHelper extends SQLiteOpenHelper {
String DB_PATH = null;
private static String DB_NAME = "marking";
public static final String TABLE_NAME = "MARKING_DATA";
private SQLiteDatabase myDataBase;
private final Context myContext;
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, 10);
this.myContext = context;
this.DB_PATH = "/data/data/" + context.getPackageName() + "/" + "databases/";
Log.e("Path 1", DB_PATH);
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
public void openDataBase() throws SQLException {
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public Cursor getRow(String key){
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("select * from " + TABLE_NAME + "where marking = "+key,null);
return res;
}
}
MyExpandableListAdapter.java
package com.example.sutetpedia;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
import com.example.sutetpedia.DatabaseHelper;
import android.widget.Toast;
import com.example.sutetpedia.ChildRow;
import com.example.sutetpedia.ParentRow;
import com.example.sutetpedia.R;
import java.util.ArrayList;
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
DatabaseHelper myDb;
String key;
private Context context;
private ArrayList<ParentRow> parentRowList;
private ArrayList<ParentRow> originalList;
public MyExpandableListAdapter(Context context
, ArrayList<ParentRow> originalList) {
this.context = context;
this.parentRowList = new ArrayList<>();
this.parentRowList.addAll(originalList);
this.originalList = new ArrayList<>();
this.originalList.addAll(originalList);
}
@Override
public int getGroupCount() {
return parentRowList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return parentRowList.get(groupPosition).getChildList().size();
}
@Override
public Object getGroup(int groupPosition) {
return parentRowList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return parentRowList.get(groupPosition).getChildList().get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
ParentRow parentRow = (ParentRow) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.parent_row, null);
}
TextView heading = (TextView) convertView.findViewById(R.id.parent_text);
heading.setText(parentRow.getName().trim());
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildRow childRow = (ChildRow) getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater)
context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.child_row, null);
}
final TextView childText = (TextView) convertView.findViewById(R.id.child_text);
childText.setText(childRow.getText().trim());
final View finalConvertView = convertView;
childText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Cursor res = myDb.getRow(key);
if(res.getCount() == 0) {
// show message
showMessage("Error","Nothing found");
return;
}
StringBuffer buffer = new StringBuffer();
while (res.moveToNext()) {
buffer.append("Marking :"+ res.getString(0)+"\n");
buffer.append("Quantity :"+ res.getString(1)+"\n");
buffer.append("Profile :"+ res.getString(2)+"\n");
buffer.append("Length :"+ res.getString(3)+"\n\n");
buffer.append("Weight :"+ res.getString(4)+"\n\n");
buffer.append("Total Weight :"+ res.getString(5)+"\n\n");
}
// Show all data
showMessage("Data",buffer.toString());
}
});
return convertView;
}
public void showMessage(String title,String Message){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(true);
builder.setTitle(title);
builder.setMessage(Message);
builder.show();
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public void filterData(String query) {
query = query.toLowerCase();
parentRowList.clear();
if (query.isEmpty()) {
parentRowList.addAll(originalList);
}
else {
for (ParentRow parentRow : originalList) {
ArrayList<ChildRow> childList = parentRow.getChildList();
ArrayList<ChildRow> newList = new ArrayList<ChildRow>();
for (ChildRow childRow: childList) {
if (childRow.getText().toLowerCase().contains(query)) {
newList.add(childRow);
}
} // end for (com.example.user.searchviewexpandablelistview.ChildRow childRow: childList)
if (newList.size() > 0) {
ParentRow nParentRow = new ParentRow(parentRow.getName(), newList);
parentRowList.add(nParentRow);
}
} // end or (com.example.user.searchviewexpandablelistview.ParentRow parentRow : originalList)
} // end else
notifyDataSetChanged();
}
}
我将代码运行到我的设备中并成功编译。但是当我点击其中一个Child Rows时,应用程序会在几秒钟后停止。
请告诉我,我的代码中是否有任何更改。先谢谢!