1

2つの別々のデータベースクエリを1つのlistViewに結合する方法について私はかなり混乱しています。

現在、私のlistViewには、データベース内の破損したコンポーネントテーブルを照会し、特定の場所の破損したコンポーネントのリストを提供する次のアダプタが入力されています。

private class MyListAdapter extends ResourceCursorAdapter { 

    // In your ListActivity class, create a new inner class that extends ResourceCursorAdapter. 
    //This inner class is the custom CursorAdapter we will use to manage how data is bound to a list item:

    public MyListAdapter(Context context, Cursor cursor) { 
        super(context, R.layout.row_location, cursor);
    } 

    @Override
    public void bindView(View view, Context context, Cursor cursor) { 
        TextView text_first_line = (TextView) view.findViewById(R.id.location_row_item_main_text);
        TextView text_second_line = (TextView) view.findViewById(R.id.location_row_item_secondary_text);
        ImageView flagIcon = (ImageView) view.findViewById(R.id.flagIcon);

        String row_text_component = cursor.getString(cursor.getColumnIndex(RMDbAdapter.COMPONENT));
        String row_text_position = ", Position " + cursor.getString(cursor.getColumnIndex(RMDbAdapter.POSITION));
        if(row_text_position.equals(", Position Not Applicable")){
            row_text_position = "";
        }
        String row_text_action = " - " + cursor.getString(cursor.getColumnIndex(RMDbAdapter.ACTION_REQUIRED));

        text_first_line.setText(row_text_component + row_text_position + row_text_action);
        text_second_line.setText("Dexion Speedlock, S Duty, 3000mm");

        String risk = cursor.getString(cursor.getColumnIndex(RMDbAdapter.RISK));
        if (risk.equals("Red Risk")){
            flagIcon.setImageResource(R.drawable.red_flag);
        }
        else if (risk.equals("Green Risk")){
            flagIcon.setImageResource(R.drawable.green_flag);
        }
        else if (risk.equals("No Risk")){
            flagIcon.setImageResource(R.drawable.note);
        }

    }
}

これは、アクティビティの開始時に次の電話をかけるとトリガーされます。

private void setAdapter(){

    // Get a Cursor for the list items

    Cursor listComponentCursor = rmDbHelper.fetchDamagedComponentsForLocation(locationId);
    componentCursorSize = listComponentCursor.getCount();
    startManagingCursor(listComponentCursor); 
    // set the custom list adapter     
    setListAdapter(new MyListAdapter(this, listComponentCursor));

}

したがって、別のテーブル(今回はテーブルを発行)に2番目のクエリを作成し、これを破損したコンポーネントのリストの下のlistViewに追加します。

複数のテーブルからこのリストビューを読んでいますか?、JoinまたはMergeカーソルを使用する必要があると思います。しかし、私が調査したことから、どちらの概念もコードに統合する方法がまだわかりません。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

2

表示していませんnewViewが、カーソルアダプタのメソッドを上書きしたと仮定します。MergeCursorは、あるクエリの結果を次のクエリの上にスタックするだけです。CursorJoinerは、結果をほぼ並べて表示します。MergeCursorが必要なようです。

2番目のクエリの結果を最初のクエリに連結するだけの場合は、両方のクエリを実行して、MergeCursorを作成します。レイアウトを変える必要がある場合、または列名を変える必要がある場合getItemViewTypeは、アダプターのメソッドをオーバーライドする必要があります。次に、newViewメソッドで、タイプに基づいてさまざまなビューを膨らませることができます。タイプを確認し、bindView正しい値を正しいビューに適用する必要があります。

コードに関するいくつかのランダムなヒント:

1)ViewHolderパターンを使用すると、はるかに高速になります。

2)リテラル文字列はNullPointerExceptionをスローできないため、"literal string".equals(variable)代わりに実行することをお勧めしますvariable.equals("literal string")

于 2012-10-24T21:01:44.817 に答える