[英]Android - Populate an ListView
CreateDatabse: CreateDatabse:
public void createDataBase() throws IOException
{
//If database not exists copy it from the assets
boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist)
{
this.getReadableDatabase();
this.close();
try
{
//Copy the database from assests
copyDataBase();
}
catch (IOException mIOException)
{
throw new Error("ErrorCopyingDataBase");
}
}
}
TestAdapter: TestAdapter:
import java.io.IOException;
import java.util.ArrayList;
import android.view.View;
import android.view.ViewGroup;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class TestAdapter extends Activity
{
ArrayList<Horario> array = new ArrayList<Horario>();
protected static final String TAG = "DataAdapter";
private final Context mContext;
private SQLiteDatabase mDb;
private DataBaseHelper mDbHelper;
public TestAdapter(Context context)
{
this.mContext = context;
mDbHelper = new DataBaseHelper(mContext);
}
public TestAdapter createDatabase() throws SQLException
{
try
{
mDbHelper.createDataBase();
}
catch (IOException mIOException)
{
Log.e(TAG, mIOException.toString() + " UnableToCreateDatabase");
throw new Error("UnableToCreateDatabase");
}
return this;
}
public TestAdapter open() throws SQLException
{
try
{
mDbHelper.openDataBase();
mDbHelper.close();
mDb = mDbHelper.getReadableDatabase();
}
catch (SQLException mSQLException)
{
Log.e(TAG, "open >>"+ mSQLException.toString());
throw mSQLException;
}
return this;
}
public void close()
{
mDbHelper.close();
}
public Cursor getTestData()
{
try
{
String sql ="SELECT * FROM horarios";
Cursor mCur = mDb.rawQuery(sql, null);
if (mCur!=null)
{
mCur.moveToNext();
}
return mCur;
}
catch (SQLException mSQLException)
{
Log.e(TAG, "getTestData >>"+ mSQLException.toString());
throw mSQLException;
}
}
public ArrayList<Horario> getorigem(){
String query = "select origem, destino From horarios";
Cursor cursor = mDb.rawQuery(query, new String[]{});
ArrayList<Horario> array = new ArrayList<Horario>();
while (cursor.moveToNext()) {
String _origem = cursor.getString(cursor.getColumnIndex("origem"));
String _destino = cursor.getString(cursor.getColumnIndex("destino"));
array.add(new Horario(_origem, _destino));
}
return array;
}
public void populateListView() {
// TODO Auto-generated method stub
MyListAdapter adapter = new MyListAdapter();
ListView list = (ListView) findViewById(R.id.list_view);
list.setAdapter(adapter);
}
private class MyListAdapter extends ArrayAdapter<Horario>{
public MyListAdapter() {
super(TestAdapter.this, R.layout.item_view, array);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//Make sure we have view to work with
View itemView = convertView;
if(itemView == null){
itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false);
}
//Find the car to work with.
Horario currentHorario = array.get(position);
//Fill the view
// Origem:
TextView makeText = (TextView) itemView.findViewById(R.id.view_origem);
makeText.setText(currentHorario.getOrigem());
// Destino:
TextView ConditionText = (TextView) itemView.findViewById(R.id.view_destino);
ConditionText.setText(currentHorario.getDestino());
return itemView;
}
}
}
and i try populate an ListView like this: 我尝试填充像这样的ListView:
public void populateListView() {
// TODO Auto-generated method stub
ArrayAdapter<Horario> adapter = new MyListAdapter();
ListView list = (ListView) findViewById(R.id.list_view);
list.setAdapter(adapter);
}
private class MyListAdapter extends ArrayAdapter<Horario>{
public MyListAdapter() {
super(TestAdapter.this, R.layout.item_view, array);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = convertView;
if(itemView == null){
itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false);
}
Horario currentHorario = array.get(position);
//Fill the view
// Origem:
TextView makeText = (TextView) itemView.findViewById(R.id.view_origem);
makeText.setText(currentTime.getOrigem());
// Destino:
TextView makeText = (TextView) itemView.findViewById(R.id.view_destino);
makeText.setText(currentTime.getDestino());
return itemView;
}
}
Main Activity: 主要活动:
import android.os.Bundle;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
public class MainActivity extends Activity {
SQLiteDatabase mDb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TestAdapter mDbHelper = new TestAdapter(getBaseContext());
mDbHelper.createDatabase();
}
public void search(View v) {
setContentView(R.layout.list_view);
TestAdapter mDbHelper = new TestAdapter(getBaseContext());
mDbHelper.open();
mDbHelper.getorigem();
mDbHelper.populateListView();
mDbHelper.close();
}
}
but it get error and close when i click the button LogCat 但是当我单击LogCat按钮时它会出错并关闭
02-24 08:29:32.290: E/AndroidRuntime(1168): FATAL EXCEPTION: main
02-24 08:29:32.290: E/AndroidRuntime(1168): Process: arr.app, PID: 1168
02-24 08:29:32.290: E/AndroidRuntime(1168): java.lang.IllegalStateException: Could not execute method of the activity
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.view.View$1.onClick(View.java:3823)
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.view.View.performClick(View.java:4438)
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.view.View$PerformClick.run(View.java:18422)
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.os.Handler.handleCallback(Handler.java:733)
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.os.Handler.dispatchMessage(Handler.java:95)
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.os.Looper.loop(Looper.java:136)
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.app.ActivityThread.main(ActivityThread.java:5017)
02-24 08:29:32.290: E/AndroidRuntime(1168): at java.lang.reflect.Method.invokeNative(Native Method)
02-24 08:29:32.290: E/AndroidRuntime(1168): at java.lang.reflect.Method.invoke(Method.java:515)
02-24 08:29:32.290: E/AndroidRuntime(1168): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-24 08:29:32.290: E/AndroidRuntime(1168): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-24 08:29:32.290: E/AndroidRuntime(1168): at dalvik.system.NativeStart.main(Native Method)
02-24 08:29:32.290: E/AndroidRuntime(1168): Caused by: java.lang.reflect.InvocationTargetException
02-24 08:29:32.290: E/AndroidRuntime(1168): at java.lang.reflect.Method.invokeNative(Native Method)
02-24 08:29:32.290: E/AndroidRuntime(1168): at java.lang.reflect.Method.invoke(Method.java:515)
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.view.View$1.onClick(View.java:3818)
02-24 08:29:32.290: E/AndroidRuntime(1168): ... 11 more
02-24 08:29:32.290: E/AndroidRuntime(1168): Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate()
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.app.Activity.getSystemService(Activity.java:4532)
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
02-24 08:29:32.290: E/AndroidRuntime(1168): at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153)
02-24 08:29:32.290: E/AndroidRuntime(1168): at arr.app.TestAdapter$MyListAdapter.<init>(TestAdapter.java:119)
02-24 08:29:32.290: E/AndroidRuntime(1168): at arr.app.TestAdapter.populateListView(TestAdapter.java:111)
02-24 08:29:32.290: E/AndroidRuntime(1168): at arr.app.MainActivity.search(MainActivity.java:32)
02-24 08:29:32.290: E/AndroidRuntime(1168): ... 14 more
activity_main.xml activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/btnsearch"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:onClick="search"
android:text="Search" />
<TextView
android:id="@+id/lbldestino"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblorigem"
android:layout_below="@+id/lblorigem"
android:layout_marginTop="54dp"
android:text="Destino"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/lblorigem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="18dp"
android:text="Origem"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/txtorigem"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lblorigem"
android:layout_below="@+id/lblorigem"
android:ems="10" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/txtdestino"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/lbldestino"
android:layout_below="@+id/lbldestino"
android:ems="10" />
</RelativeLayout>
i start programing to android about 1 week and im at some days trying slove that problem appreciate any help 我开始编程到android大约1周,即时通讯在某些天试图解决这个问题,感谢任何帮助
The problem is that your adapter is extending Activity
and not implementing setContentView
inside the onCreate
method, so it fails when calling findViewById(R.id.list_view);
问题是您的适配器正在扩展
Activity
而不在onCreate
方法内实现setContentView
,因此在调用findViewById(R.id.list_view);
时失败findViewById(R.id.list_view);
. 。 You need to use content of your
populateListView
method inside the MainActivity
, assuming that the list_view
layout file (R.layout.list_view) contains a ListView
called list_view
(R.id.list_view). 您需要在
MainActivity
内部使用populateListView
方法的内容,假设list_view
布局文件(R.layout.list_view)包含一个名为list_view
(R.id.list_view)的ListView
。
public void search(View v) {
setContentView(R.layout.list_view);
TestAdapter mDbHelper = new TestAdapter(getBaseContext());
mDbHelper.open();
ArrayAdapter<Horario> adapter = new MyListAdapter(mDbHelper.getorigem());
ListView list = (ListView) findViewById(R.id.list_view);
list.setAdapter(adapter);
mDbHelper.close();
}
In your MyListAdapter
modify your constructor to: 在
MyListAdapter
将构造函数修改为:
public MyListAdapter(ArrayList<Horario> arrayHorario) {
array = arrayHorario;
super(TestAdapter.this, R.layout.item_view, array);
}
To call the search on click button, use the following method: 要调用单击按钮上的搜索,请使用以下方法:
bt_search.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
search(v);
}
}
Hope it helps! 希望能帮助到你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.