我需要创建一个多级列表。喜欢这个图像
但不知道如何实现多级列表视图。
我尝试像这样创建自己的
main1.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none"
android:background="#ffffff"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"
android:id="@+id/add"
android:orientation="vertical"
/>
</ScrollView>
TreenodeDatabase.java
package com.android.treenode;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;
public class TreenodeDatabase {
private static final String DB_NAME1 = "treenode.sqlite3";
private static final int databse_version=1;
private Context m_contextObj = null ;
private SQLiteDatabase db = null ;
private SQLiteStatement insertstmt;
int totalcolms;
public TreenodeDatabase(Context ctx)
{
m_contextObj = ctx;
OpenHelper oh=new OpenHelper (m_contextObj);
this.db=oh.getWritableDatabase();
}
public void CloseDB()
{
try
{
db.close();
}
catch(Exception ex)
{
}
finally{
db=null;
//return nt;
}
}
public void getContinentData(){
Cursor mCursor = null;
String SqlQuery = null;
int numRows;
SqlQuery = "Select * from Continent";
Log.d("Query ------>",SqlQuery);
try{
ArrayListClass.continent.clear();
}catch (Exception e) {
// TODO: handle exception
}
try
{
mCursor = db.rawQuery(SqlQuery, null);
if(mCursor != null)
{
numRows = mCursor.getCount();
Log.e("1","");
mCursor.moveToFirst();
for (int i = 0; i < numRows; ++i)
{
ObjectClass obj = new ObjectClass();
obj.continent_id = mCursor.getString(0).toString().replace('$',' ').trim().toString();
obj.continent = mCursor.getString(1).toString().replace('$',' ').trim().toString();
ArrayListClass.continent.add(obj);
mCursor.moveToNext();
}
}
}
catch (SQLException e)
{
}
finally{
try{
mCursor.close();
mCursor=null;
}catch (Exception e) {
// TODO: handle exception
}
}
}
public void getCountryData(String continent_id){
Cursor mCursor = null;
String SqlQuery = null;
int numRows;
SqlQuery = "Select * from Country where Rid=" + continent_id;
Log.d("Query ------>",SqlQuery);
try{
ArrayListClass.country.clear();
}catch (Exception e) {
// TODO: handle exception
}
try
{
mCursor = db.rawQuery(SqlQuery, null);
if(mCursor != null)
{
numRows = mCursor.getCount();
Log.e("1","");
mCursor.moveToFirst();
for (int i = 0; i < numRows; ++i)
{
ObjectClass obj = new ObjectClass();
obj.country_id = mCursor.getString(0).toString().replace('$',' ').trim().toString();
obj.country = mCursor.getString(1).toString().replace('$',' ').trim().toString();
obj.country_ref_id = mCursor.getString(2).toString().replace('$',' ').trim().toString();
ArrayListClass.country.add(obj);
mCursor.moveToNext();
}
}
}
catch (SQLException e)
{
}
finally{
try{
}catch (Exception e) {
// TODO: handle exception
}
try{
mCursor.close();
mCursor=null;
}catch (Exception e) {
// TODO: handle exception
}
}
}
public void getStateData(String country_id){
Cursor mCursor = null;
String SqlQuery = null;
int numRows;
SqlQuery = "Select * from State where Rid=" + country_id;
Log.d("Query ------>",SqlQuery);
try{
ArrayListClass.state.clear();
}catch (Exception e) {
// TODO: handle exception
}
try
{
mCursor = db.rawQuery(SqlQuery, null);
if(mCursor != null)
{
numRows = mCursor.getCount();
Log.e("1","");
mCursor.moveToFirst();
for (int i = 0; i < numRows; ++i)
{
ObjectClass obj = new ObjectClass();
obj.state_id = mCursor.getString(0).toString().replace('$',' ').trim().toString();
obj.state = mCursor.getString(1).toString().replace('$',' ').trim().toString();
obj.state_ref_id = mCursor.getString(2).toString().replace('$',' ').trim().toString();
ArrayListClass.state.add(obj);
mCursor.moveToNext();
}
}
}
catch (SQLException e)
{
}
finally{
try{
mCursor.close();
mCursor=null;
}catch (Exception e) {
// TODO: handle exception
}
}
}
public void getRegionData(String state_id){
Cursor mCursor = null;
String SqlQuery = null;
int numRows;
SqlQuery = "Select * from Region where Rid=" + state_id;
Log.d("Query ------>",SqlQuery);
try{
ArrayListClass.region.clear();
}catch (Exception e) {
// TODO: handle exception
}
try
{
mCursor = db.rawQuery(SqlQuery, null);
if(mCursor != null)
{
numRows = mCursor.getCount();
Log.e("1","");
mCursor.moveToFirst();
for (int i = 0; i < numRows; ++i)
{
ObjectClass obj = new ObjectClass();
obj.region_id = mCursor.getString(0).toString().replace('$',' ').trim().toString();
obj.region = mCursor.getString(1).toString().replace('$',' ').trim().toString();
obj.region_ref_id = mCursor.getString(2).toString().replace('$',' ').trim().toString();
ArrayListClass.region.add(obj);
mCursor.moveToNext();
}
}
}
catch (SQLException e)
{
}
finally{
try{
mCursor.close();
mCursor=null;
}catch (Exception e) {
// TODO: handle exception
}
}
}
public void getAreaData(String region_id){
Cursor mCursor = null;
String SqlQuery = null;
int numRows;
SqlQuery = "Select * from Area where Rid=" + region_id;
Log.d("Query ------>",SqlQuery);
try{
ArrayListClass.area.clear();
}catch (Exception e) {
// TODO: handle exception
}
try
{
mCursor = db.rawQuery(SqlQuery, null);
if(mCursor != null)
{
numRows = mCursor.getCount();
Log.e("1","");
mCursor.moveToFirst();
for (int i = 0; i < numRows; ++i)
{
ObjectClass obj = new ObjectClass();
obj.area_id = mCursor.getString(0).toString().replace('$',' ').trim().toString();
obj.area = mCursor.getString(1).toString().replace('$',' ').trim().toString();
obj.area_ref_id = mCursor.getString(2).toString().replace('$',' ').trim().toString();
ArrayListClass.area.add(obj);
mCursor.moveToNext();
}
}
}
catch (SQLException e)
{
}
finally{
try{
mCursor.close();
mCursor=null;
}catch (Exception e) {
// TODO: handle exception
}
}
}
public long insert(String values){
Log.e("DbHelper : ", "Insert function called " + values);
this.insertstmt=this.db.compileStatement(values);
Log.e("DbHelper :", "Executing insert query here ");
return this.insertstmt.executeInsert();
}
private static class OpenHelper extends SQLiteOpenHelper {
OpenHelper(Context context){
super(context, DB_NAME1, null, databse_version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE "+"Continent"+"(Id INTEGER PRIMARY KEY AUTOINCREMENT,Name TXT)");
db.execSQL("CREATE TABLE "+"Country"+"(Id INTEGER PRIMARY KEY AUTOINCREMENT,Name TXT,Rid TXT)");
db.execSQL("CREATE TABLE "+"State"+"(Id INTEGER PRIMARY KEY AUTOINCREMENT,Name TXT,Rid TXT)");
db.execSQL("CREATE TABLE "+"Region"+"(Id INTEGER PRIMARY KEY AUTOINCREMENT,Name TXT,Rid TXT)");
db.execSQL("CREATE TABLE "+"Area"+"(Id INTEGER PRIMARY KEY AUTOINCREMENT,Name TXT,Rid TXT)");
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
}
ObjectClass.java
package com.android.treenode;
public class ObjectClass{
String continent = "";
String country = "";
String state = "";
String region = "";
String area = "";
String continent_id = "";
String country_id = "";
String state_id = "";
String region_id = "";
String area_id = "";
String country_ref_id = "";
String state_ref_id = "";
String region_ref_id = "";
String area_ref_id = "";
public static boolean [] showcountry = null;
public static boolean [] showstate = null;
public static boolean [] showregion = null;
public static boolean [] showarea = null;
//public static Bitmap b;
}
ArrayListClass.java
package com.android.treenode;
import java.util.ArrayList;
public class ArrayListClass{
public static ArrayList<ObjectClass> continent = new ArrayList<ObjectClass>();
public static ArrayList<ObjectClass> country = new ArrayList<ObjectClass>();
public static ArrayList<ObjectClass> state = new ArrayList<ObjectClass>();
public static ArrayList<ObjectClass> region = new ArrayList<ObjectClass>();
public static ArrayList<ObjectClass> area = new ArrayList<ObjectClass>();
//public static ArrayList<ObjectClass,ArrayList<ObjectCl> area1 = new ArrayList<ObjectClass,area>();
}
TreenodeActivity.java
package com.android.treenode;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;
public class TreenodeActivity extends Activity {
TreenodeDatabase tnd;
LinearLayout llAdd;
int count = 0;
float size = 24f;
int items = 3;
int padding = 50;
boolean showcountry;
boolean showstate = true,showregion = true,showarea = true;
//*//** Called when the activity is first created. *//*
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
insertMethod();
try{
tnd = new TreenodeDatabase(this);
tnd.getContinentData();
tnd.CloseDB();
}catch (Exception e) {
// TODO: handle exception
}
llAdd = (LinearLayout)findViewById(R.id.add);
//showcountry = new boolean[ArrayListClass.continent.size()];
for(int i=0; i<ArrayListClass.continent.size(); i++){
final int a = i;
final LinearLayout ll = new LinearLayout(this);
ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
ll.setGravity(Gravity.LEFT|Gravity.CENTER);
ll.setBackgroundColor(Color.WHITE);
ll.setOrientation(LinearLayout.VERTICAL);
final TextView tv = new TextView(this);
tv.setText(ArrayListClass.continent.get(i).continent + "");
tv.setTextSize(size);
tv.setTextColor(Color.BLACK);
tv.setGravity(Gravity.LEFT|Gravity.CENTER);
tv.setBackgroundColor(Color.WHITE);
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try{
tnd = new TreenodeDatabase(getBaseContext());
tnd.getCountryData(ArrayListClass.continent.get(a).continent_id);
tnd.CloseDB();
}catch (Exception e) {
// TODO: handle exception
}
if(showcountry){
if(ArrayListClass.country.size()>0){
for(int i = 0; i<ArrayListClass.country.size(); i++){
final int b = i;
final LinearLayout ll1 = new LinearLayout(getBaseContext());
if(i==0){
try{
ll1.removeAllViews();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
ll1.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
ll1.setGravity(Gravity.LEFT|Gravity.CENTER);
ll1.setBackgroundColor(Color.WHITE);
ll1.setOrientation(LinearLayout.VERTICAL);
ll1.setPadding(50, 1, 1, 1);
final TextView tv1 = new TextView(getBaseContext());
tv1.setText(ArrayListClass.country.get(i).country + "");
tv1.setTextSize(size);
tv1.setTextColor(Color.BLACK);
tv1.setGravity(Gravity.LEFT|Gravity.CENTER);
tv1.setBackgroundColor(Color.WHITE);
tv1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try{
tnd = new TreenodeDatabase(getBaseContext());
tnd.getStateData(ArrayListClass.country.get(b).country_id);
tnd.CloseDB();
}catch (Exception e) {
// TODO: handle exception
}
if(showstate){
if(ArrayListClass.state.size()>0){
for(int i = 0; i<ArrayListClass.state.size(); i++){
final LinearLayout ll2 = new LinearLayout(getBaseContext());
ll2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
ll2.setGravity(Gravity.LEFT|Gravity.CENTER);
ll2.setBackgroundColor(Color.WHITE);
ll2.setOrientation(LinearLayout.VERTICAL);
ll2.setPadding(50, 1, 1, 1);
final TextView tv2 = new TextView(getBaseContext());
tv2.setText(ArrayListClass.state.get(i).state + "");
tv2.setTextSize(size);
tv2.setTextColor(Color.BLACK);
tv2.setGravity(Gravity.LEFT|Gravity.CENTER);
tv2.setBackgroundColor(Color.WHITE);
tv2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try{
tnd = new TreenodeDatabase(getBaseContext());
tnd.getRegionData(ArrayListClass.state.get(b).state_id);
tnd.CloseDB();
}catch (Exception e) {
// TODO: handle exception
}
if(showregion){
if(ArrayListClass.region.size()>0){
for(int i = 0; i<ArrayListClass.region.size(); i++){
final LinearLayout ll3 = new LinearLayout(getBaseContext());
ll3.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
ll3.setGravity(Gravity.LEFT|Gravity.CENTER);
ll3.setBackgroundColor(Color.WHITE);
ll3.setOrientation(LinearLayout.VERTICAL);
ll3.setPadding(50, 1, 1, 1);
final TextView tv3 = new TextView(getBaseContext());
tv3.setText(ArrayListClass.region.get(i).region + "");
tv3.setTextSize(size);
tv3.setTextColor(Color.BLACK);
tv3.setGravity(Gravity.LEFT|Gravity.CENTER);
tv3.setBackgroundColor(Color.WHITE);
tv3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try{
tnd = new TreenodeDatabase(getBaseContext());
tnd.getAreaData(ArrayListClass.region.get(b).region_id);
tnd.CloseDB();
}catch (Exception e) {
// TODO: handle exception
}
if(showarea){
if(ArrayListClass.area.size()>0){
for(int i = 0; i<ArrayListClass.area.size(); i++){
LinearLayout ll4 = new LinearLayout(getBaseContext());
ll4.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
ll4.setGravity(Gravity.LEFT|Gravity.CENTER);
ll4.setBackgroundColor(Color.WHITE);
ll4.setOrientation(LinearLayout.VERTICAL);
ll4.setPadding(50, 1, 1, 1);
final TextView tv4 = new TextView(getBaseContext());
tv4.setText(ArrayListClass.area.get(i).area+ "");
tv4.setTextSize(size);
tv4.setTextColor(Color.BLACK);
tv4.setGravity(Gravity.LEFT|Gravity.CENTER);
tv4.setBackgroundColor(Color.WHITE);
tv4.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.e("Log","clicked" + tv4.getText().toString());
Toast.makeText(getBaseContext(), tv4.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
ll4.addView(tv4);
ll3.addView(ll4);
}
}
showarea = false;
}else{
ArrayListClass.area.clear();
ll3.removeAllViews();
ll3.addView(tv3);
showarea = true;
}
//tv3.setClickable(false);
}
});
ll3.addView(tv3);
ll2.addView(ll3);
//tv3.setClickable(false);
}
}
showregion = false;
}else{
ArrayListClass.region.clear();
ArrayListClass.area.clear();
ll2.removeAllViews();
ll2.addView(tv2);
showregion = true;
}
//tv2.setClickable(false);
}
});
ll2.addView(tv2);
ll1.addView(ll2);
//tv2.setClickable(false);
}
}
showstate = false;
}else{
ArrayListClass.state.clear();
ArrayListClass.region.clear();
ArrayListClass.area.clear();
ll1.removeAllViews();
ll1.addView(tv1);
showstate = true;
}
//tv1.setClickable(false);
}
});
ll1.addView(tv1);
ll.addView(ll1);
//tv1.setClickable(false);
}
}
showcountry = false;
}else{
ArrayListClass.state.clear();
ArrayListClass.region.clear();
ArrayListClass.area.clear();
ArrayListClass.country.clear();
ll.removeAllViews();
ll.addView(tv);
showcountry = true;
}
//tv.setClickable(false);
}
});
ll.addView(tv);
llAdd.addView(ll);
}
Log.e("Log","Check");
}
public void insertMethod(){
tnd = new TreenodeDatabase(this);
StringBuilder st = new StringBuilder();
st.append("insert into Continent(Name) values('" + "Continent1" + "');") ;
tnd.insert(st.toString());
tnd.CloseDB();
tnd = new TreenodeDatabase(this);
StringBuilder st1 = new StringBuilder();
st1.append("insert into Continent(Name) values('" + "Continent2" + "');") ;
tnd.insert(st1.toString());
tnd.CloseDB();
tnd = new TreenodeDatabase(this);
StringBuilder st2 = new StringBuilder();
st2.append("insert into Country(Name,Rid) values('" + "Country1A" + "','" + "1" + "');") ;
tnd.insert(st2.toString());
tnd.CloseDB();
tnd = new TreenodeDatabase(this);
StringBuilder st3 = new StringBuilder();
st3.append("insert into Country(Name,Rid) values('" + "Country1B" + "','" + "1" + "');") ;
tnd.insert(st3.toString());
tnd.CloseDB();
tnd = new TreenodeDatabase(this);
StringBuilder st4 = new StringBuilder();
st4.append("insert into Country(Name,Rid) values('" + "Country2A" + "','" + "2" + "');") ;
tnd.insert(st4.toString());
tnd.CloseDB();
tnd = new TreenodeDatabase(this);
StringBuilder st5 = new StringBuilder();
st5.append("insert into Country(Name,Rid) values('" + "Country2B" + "','" + "2" + "');") ;
tnd.insert(st5.toString());
tnd.CloseDB();
tnd = new TreenodeDatabase(this);
StringBuilder st6 = new StringBuilder();
st6.append("insert into State(Name,Rid) values('" + "State1" + "','" + "1" + "');") ;
tnd.insert(st6.toString());
tnd.CloseDB();
tnd = new TreenodeDatabase(this);
StringBuilder st7 = new StringBuilder();
st7.append("insert into State(Name,Rid) values('" + "State2" + "','" + "1" + "');") ;
tnd.insert(st7.toString());
tnd.CloseDB();
tnd = new TreenodeDatabase(this);
StringBuilder st8 = new StringBuilder();
st8.append("insert into Region(Name,Rid) values('" + "Region1" + "','" + "1" + "');") ;
tnd.insert(st8.toString());
tnd.CloseDB();
tnd = new TreenodeDatabase(this);
StringBuilder st9 = new StringBuilder();
st9.append("insert into Area(Name,Rid) values('" + "Area1" + "','" + "1" + "');") ;
tnd.insert(st9.toString());
tnd.CloseDB();
}
}
请帮助我,我想我接近成功.. 这不太好用。我错过了什么。
修改
loccat输出
09-20 16:27:52.254:E / Database(5598):从未在数据库上显式调用close() '/data/data/com.android.treenode/databases/treenode.sqlite3'09-20 16:27:52.254:E /数据库(5598): android.database.sqlite.DatabaseObjectNotClosedException:应用程序 没有关闭09-20打开的游标或数据库对象 16:27:52.254:E / Database(5598):at android.database.sqlite.SQLiteDatabase。(SQLiteDatabase.java:1960) 09-20 16:27:52.254:E / Database(5598):at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:906) 09-20 16:27:52.254:E / Database(5598):at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:940) 09-20 16:27:52.254:E / Database(5598):at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:933) 09-20 16:27:52.254:E / Database(5598):at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:614) 09-20 16:27:52.254:E / Database(5598):at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 09-20 16:27:52.254:E / Database(5598):at com.android.treenode.TreenodeDatabase。(TreenodeDatabase.java:23) 09-20 16:27:52.254:E / Database(5598):at com.android.treenode.TreenodeActivity $ 1 $ 1 $ 1.onClick(TreenodeActivity.java:810) 09-20 16:27:52.254:E / Database(5598):at android.view.View.performClick(View.java:2533)09-20 16:27:52.254: E /数据库(5598):at android.view.View $ PerformClick.run(View.java:9320)09-20 16:27:52.254: E /数据库(5598):at android.os.Handler.handleCallback(Handler.java:587)09-20 16:27:52.254:E / Database(5598):at android.os.Handler.dispatchMessage(Handler.java:92)09-20 16:27:52.254:E / Database(5598):at android.os.Looper.loop(Looper.java:150)09-20 16:27:52.254: E /数据库(5598):at android.app.ActivityThread.main(ActivityThread.java:4385)09-20 16:27:52.254:E / Database(5598):at java.lang.reflect.Method.invokeNative(Native Method)09-20 16:27:52.254:E / Database(5598):at java.lang.reflect.Method.invoke(Method.java:507)09-20 16:27:52.254: E /数据库(5598):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:849) 09-20 16:27:52.254:E / Database(5598):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)09-20 16:27:52.254:E / Database(5598):at dalvik.system.NativeStart.main(原生方法)
我认为这是由于数据库没有正确关闭。(我处理这个)
但代码在某些时候显示子级别没有正常工作。有一段时间它显示双重值。