如何在代码下面格式化ListView TextView

时间:2014-09-09 11:03:06

标签: android listview android-sqlite

Guyz这似乎很容易,但对我来说实施起来有点困难。我正在使用listview来显示mysqlite数据库。 请进行更改,以便我自定义textview,即大小,颜色,字体以xml显示。 由于初学者标签,我很难实现。

//主要活动

import java.util.ArrayList;

import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends ListActivity {
    private static final String DB_NAME = "friendlist";
    private static final String TABLE_NAME = "friends";
    private static final String FRIEND_ID = "_id";
    private static final String FRIEND_NAME = "name";

    private SQLiteDatabase database;
    private ListView listView;
    private ArrayList<String> friends;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        ExternalDbOpenHelper dbOpenHelper = new ExternalDbOpenHelper(this, DB_NAME);
        database = dbOpenHelper.openDataBase();

        fillFreinds();
        setUpList();      
    }

    private void setUpList() {

        setListAdapter(new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_1, friends));
        listView = getListView();


        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                int position,long id) {
                Toast.makeText(getApplicationContext(),
                            ((TextView) view).getText().toString(),
                             Toast.LENGTH_SHORT).show();                
            }
        });
    }

    private void fillFreinds() {
        friends = new ArrayList<String>();
        Cursor friendCursor = database.query(TABLE_NAME,
                                             new String[] 
                                             {FRIEND_ID, FRIEND_NAME},
                                             null, null, null, null
                                             , FRIEND_NAME);
        friendCursor.moveToFirst();
        if(!friendCursor.isAfterLast()) {
            do {
                String name = friendCursor.getString(1);
                friends.add(name);
            } while (friendCursor.moveToNext());
        }
        friendCursor.close();
    }
}

// ExternalDbOpenHelper

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class ExternalDbOpenHelper extends SQLiteOpenHelper {


    public static String DB_PATH;

    public static String DB_NAME;
    public SQLiteDatabase database;
    public final Context context;

    public SQLiteDatabase getDb() {
        return database;
    }

    public ExternalDbOpenHelper(Context context, String databaseName) {
        super(context, databaseName, null, 1);
        this.context = context;

        String packageName = context.getPackageName();
        DB_PATH = String.format("//data//data//%s//databases//", packageName);
        DB_NAME = databaseName;
        openDataBase();
    }


    public void createDataBase() {
        boolean dbExist = checkDataBase();
        if (!dbExist) {
            this.getReadableDatabase();
            try {
                copyDataBase();
            } catch (IOException e) {
                Log.e(this.getClass().toString(), "Copying error");
                throw new Error("Error copying database!");
            }
        } else {
            Log.i(this.getClass().toString(), "Database already exists");
        }
    }

    private boolean checkDataBase() {
        SQLiteDatabase checkDb = null;
        try {
            String path = DB_PATH + DB_NAME;
            checkDb = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READONLY);
        } catch (SQLException e) {
            Log.e(this.getClass().toString(), "Error while checking db");
        }
        if (checkDb != null) {
            checkDb.close();
        }
        return checkDb != null;
    }
    private void copyDataBase() throws IOException {
        InputStream externalDbStream = context.getAssets().open(DB_NAME);

        String outFileName = DB_PATH + DB_NAME;

        OutputStream localDbStream = new FileOutputStream(outFileName);

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = externalDbStream.read(buffer)) > 0) {
            localDbStream.write(buffer, 0, bytesRead);
        }

        localDbStream.close();
        externalDbStream.close();

    }

    public SQLiteDatabase openDataBase() throws SQLException {
        String path = DB_PATH + DB_NAME;
        if (database == null) {
            createDataBase();
            database = SQLiteDatabase.openDatabase(path, null,
                SQLiteDatabase.OPEN_READWRITE);
        }
        return database;
    }
    @Override
    public synchronized void close() {
        if (database != null) {
            database.close();
        }
        super.close();
    }
    @Override
    public void onCreate(SQLiteDatabase db) {}
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

修改 自定义TextView XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical" >
     <TextView android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp" android:text="TextView" /> 
</LinearLayout>

//错误

09-09 16:55:36.970: E/ArrayAdapter(906): You must supply a resource ID for a TextView
09-09 16:55:36.980: D/AndroidRuntime(906): Shutting down VM
09-09 16:55:36.980: W/dalvikvm(906): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
09-09 16:55:37.041: E/AndroidRuntime(906): FATAL EXCEPTION: main
09-09 16:55:37.041: E/AndroidRuntime(906): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.AbsListView.obtainView(AbsListView.java:2271)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.ListView.makeAndAddView(ListView.java:1769)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.ListView.fillDown(ListView.java:672)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.ListView.fillFromTop(ListView.java:733)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.ListView.layoutChildren(ListView.java:1622)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.AbsListView.onLayout(AbsListView.java:2106)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.View.layout(View.java:13754)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.ViewGroup.layout(ViewGroup.java:4364)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.View.layout(View.java:13754)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.ViewGroup.layout(ViewGroup.java:4364)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.View.layout(View.java:13754)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.ViewGroup.layout(ViewGroup.java:4364)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.View.layout(View.java:13754)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.ViewGroup.layout(ViewGroup.java:4364)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.View.layout(View.java:13754)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.ViewGroup.layout(ViewGroup.java:4364)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1868)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1689)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.Choreographer.doCallbacks(Choreographer.java:555)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.Choreographer.doFrame(Choreographer.java:525)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.os.Handler.handleCallback(Handler.java:615)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.os.Handler.dispatchMessage(Handler.java:92)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.os.Looper.loop(Looper.java:137)
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.app.ActivityThread.main(ActivityThread.java:4745)
09-09 16:55:37.041: E/AndroidRuntime(906):  at java.lang.reflect.Method.invokeNative(Native Method)
09-09 16:55:37.041: E/AndroidRuntime(906):  at java.lang.reflect.Method.invoke(Method.java:511)
09-09 16:55:37.041: E/AndroidRuntime(906):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-09 16:55:37.041: E/AndroidRuntime(906):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-09 16:55:37.041: E/AndroidRuntime(906):  at dalvik.system.NativeStart.main(Native Method)
09-09 16:55:37.041: E/AndroidRuntime(906): Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
09-09 16:55:37.041: E/AndroidRuntime(906):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379)
09-09 16:55:37.041: E/AndroidRuntime(906):  ... 42 more

1 个答案:

答案 0 :(得分:0)

我修好了 改变

    setListAdapter(new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, friends));

setListAdapter(new ArrayAdapter<String>(this,R.layout.simple_list_item_1**,R.id.textView1**, friends));
        listView = getListView();

//感谢@ T-Rush寻求支持