Пользовательский ListView из базы данных - PullRequest
1 голос
/ 27 апреля 2011

Мне нужна помощь при заполнении данных из базы данных в пользовательском ListView. Мне удалось получить данные для отображения из базы данных, используя мой собственный XML-файл. Проблема, с которой я столкнулся, состоит в том, что все три столбца возвращаются в каждом TextView. Не каждый столбец разбирается в соответствующих TextView. Я постараюсь сделать попытку устного объяснения того, что мне нужно ниже - извините за лишнюю спячку, но я вижу ненужные ответы и комментарии на эти посты, потому что некоторые участники отвечают без просмотра кода и предполагают, что вопрос (я признать, большинство вопросов трудно следовать). Спасибо за ваше время и помощь. Я заранее прошу прощения, если я не понимаю ваши ответы на этот вопрос, я новичок в Java & Android

В list_view.xml есть LinearLayout с RealitiveLayout с (для пользовательского заголовка) и ListView с идентификатором ресурса "listItems". ListView (R.id.listItems), который находится в LinearLayout, использует list_item.xml. Внутри list_item.xml находится RelativeLayout с идентификатором ресурса «acItems». Это имеет три TextViews с идентификаторами ресурсов: «label», «listTitle» и «caption». У каждого свой стиль. Мне нужно запросить базу данных (xxx.db), которая находится на устройстве SD-Card. Таблица с этой базой данных называется AC_list, которая содержит столбцы «_id», «label», «title» и «goto». Эти столбцы должны быть переданы в соответствующие TextViews (метка n2 «метка», nittle «listTitle» и описание n2 «заголовок») в ListView (R.id.listItems), чтобы создать ОДИН СПИСОК ПУНКТОВ, в котором каждый TextView имеет свой собственный стиль для каждой строки БД. Смотрите ниже:

The list_view.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" 
 android:layout_width="fill_parent"
 android:layout_height="fill_parent" >

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="30dip" 
    android:padding="4dip"
    android:background="@drawable/gradient" >

    <ImageButton
        android:id="@+id/homeBtn"
        android:src="@drawable/ic_menu_icon"
        android:layout_width="wrap_content" 
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:background="@null" />

    <TextView
        android:id="@+id/titleBarTitle"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content" 
        android:layout_height="match_parent"
        android:textSize="18sp" />

    <ImageButton
        android:id="@+id/toolBtn"
        android:src="@drawable/ic_menu_list"
        android:layout_width="wrap_content" 
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:background="@null" />

</RelativeLayout>

<ListView 
   android:id="@+id/listItems" 
   android:layout_height="wrap_content"
   android:layout_width="fill_parent" />

</LinearLayout>

The list_item.xml:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/acItem"
style="@style/listItem" >

<TextView
    android:id="@+id/label"
    style="@style/listAcronym" />

<TextView
    android:id="@+id/listTitle"
    style="@style/listTitle" />

<TextView
    android:id="@+id/caption"
    style="@style/listDiscription"/>        

<ImageView
    style="@style/listNextIcon" />   

</RelativeLayout>

Мой адаптер (AC_Adapter.java):

public class AC_Adapter extends ArrayAdapter<String> {
static List<String> Title = new ArrayList<String>();
static List<String> Label = new ArrayList<String>();
static List<String> Description = new ArrayList<String>();

Context myContext;

public AC_Adapter(Context context, int resource, List<String> aTitle,
        List<String> aLabel, List<String> aDescription) {

    super(context, resource, aTitle);

    myContext = context;
    Title = aTitle;
    Label = aLabel;
    Description = aDescription;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater) myContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.list_item, null);
    }

    TextView tv_label = (TextView) v.findViewById(R.id.label);
    TextView tv_title = (TextView) v.findViewById(R.id.listTitle);
    TextView tv_decription = (TextView) v.findViewById(R.id.caption);

    if (tv_label != null) {
        tv_label.setText(Label.get(position));
    }
    if (tv_title != null) {
        tv_title.setText(Title.get(position));
    }
    if (tv_decription != null) {
        tv_decription.setText(Description.get(position));
    }

    return v;

}
}

И моя активность (List_AC.java):

public class List_AC extends ListActivity {

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String extStorageDirectory;

private ArrayList<String> results = new ArrayList<String>();

/**
 * -- Called when the activity is first created
 * ===================================================================
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    //setContentView(R.layout.list_view2);

    openAndQueryDatabase();
    displayResultList();
}

/**
 * -- Connect to the AC_Adapter
 * ===================================================================
 **/
private void displayResultList() {
    AC_Adapter adapter = new AC_Adapter(getApplicationContext(),
            R.layout.list_item, results, results, results);
    setListAdapter(adapter);
}

/**
 * -- Open and Query the Database
 * ====================================================================
 **/
private void openAndQueryDatabase() {

    if (android.os.Environment.getExternalStorageState().equals(
            android.os.Environment.MEDIA_MOUNTED)) {
        extStorageDirectory = Environment.getExternalStorageDirectory().toString();
        File dbfile = new File(extStorageDirectory
                + "/XXX/XXX/dB/XXX.db");

        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
        Log.i("tag", "db opened");
        try {
            Cursor c = db.rawQuery(
                    "SELECT label, title, discription, goto FROM AC_list", null);

            if (c != null) {
                if (c.moveToFirst()) {
                    do {
                        String i1 = c.getString(c.getColumnIndex("label"));
                        String i2 = c.getString(c.getColumnIndex("title"));
                        String i3 = c.getString(c.getColumnIndex("discription"));
                        results.add(i1);
                    } while (c.moveToNext());
                }
            }
        } finally {
            if (db != null)
                Log.i("tag", "db closed");
                db.close();
        }
    } else if (android.os.Environment.getExternalStorageState().equals(
            android.os.Environment.MEDIA_UNMOUNTED)) {
        Log.i("tag", "SDCard is NOT writable/mounted");
        Alerts.sdCardMissing(this);
    }
}

}

1 Ответ

2 голосов
/ 30 апреля 2011

У меня правильный ответ ЗДЕСЬ вместе с правильным кодом.

...