0

カスタムを実装しましたCursorAdapter。このアダプタは からデータを取得し、Cursorそのほとんどを にデポジットしListViewます。のフィールドの 1 つはListView別のテーブルからのデータを必要とするため、データベースに再度クエリを実行して、その部分をビューに設定する必要があります。以前ListViewはデータベースにデータがなかったので、空のタグが適切に表示されていたので、動作しているよう"no data in the db"です。データベースにデータがあるので、ListView何も表示されません! これが私のカスタムアダプターです:

    public class ScheduleAdapter extends CursorAdapter {

    private LayoutInflater mInflater;
    private int mHomeAway, mOppFK, mLocation, mWhen, mOutcome, mType, mPlayed;
    private String teamName;

    public ScheduleAdapter(Context context, Cursor c) {
        super(context, c);
        // TODO Auto-generated constructor stub

        mHomeAway = c.getColumnIndex(ScoreMasterDB.KEY_SCHHOMEAWAY);
        mOppFK = c.getColumnIndex(ScoreMasterDB.KEY_SCHOPPFK);
        mLocation = c.getColumnIndex(ScoreMasterDB.KEY_SCHLOCATION);
        mWhen = c.getColumnIndex(ScoreMasterDB.KEY_SCHWHEN);
        mOutcome = c.getColumnIndex(ScoreMasterDB.KEY_SCHOUTCOME);
        mType = c.getColumnIndex(ScoreMasterDB.KEY_SCHTYPE);
        mPlayed = c.getColumnIndex(ScoreMasterDB.KEY_SCHPLAYED);

        mInflater = LayoutInflater.from(context);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        // TODO Auto-generated method stub
        return mInflater.inflate(R.layout.schedule_main_list, parent);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        // TODO Auto-generated method stub

        TextView homeAway = (TextView) view.findViewById(R.id.tvVsAt);
        TextView oppName = (TextView) view.findViewById(R.id.tvScheduleListOpponent);
        TextView location = (TextView) view.findViewById(R.id.tvScheduleListLocation);
        TextView outcomeWhen = (TextView) view.findViewById(R.id.tvScheduleDateTimeResult);
        TextView gameType = (TextView) view.findViewById(R.id.tvScheduleType);

        ScoreMasterDB dbInfo = new ScoreMasterDB(context);
        try {
            dbInfo.open();
            teamName = dbInfo.getTeamName(cursor.getInt(mOppFK));
            dbInfo.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        homeAway.setText(cursor.getString(mHomeAway));
        oppName.setText(teamName);
        location.setText(cursor.getString(mLocation));

        //set game time or outcome
        if(cursor.getInt(mPlayed) == 0){
            outcomeWhen.setText(cursor.getString(mWhen));

            //set text style for outcome
            if(cursor.getInt(mOutcome) == 1){
                outcomeWhen.setTextAppearance(context, R.style.greenWinText);
            }
        }

        gameType.setText(cursor.getString(mType));

    }
}

このアダプターへの私の呼び出しは次のとおりです。

// get schedule cursor
            scheduleInfo = dbInfo.getScheduleCursor(teamID, seasonID);
            startManagingCursor(scheduleInfo);

            ScheduleAdapter scheduleAdapter = new ScheduleAdapter(ScheduleMain.this, scheduleInfo);
            setListAdapter(scheduleAdapter);

編集: カスタム アダプターを呼び出しているアクティビティは、チームのスケジュールを表示することになっています。最初にチームを選択するためのダイアログを表示し、次に適切なシーズンを選択するための別のダイアログを表示します。次に、一致する teamID と seasonID を使用してスケジュールのデータベースを照会します。カスタム アダプターを使用する理由は、スケジュールが対戦相手を整数の外部キーとしてリストするためです。そのため、対戦相手の適切なチーム名を取得するには、アダプターのデータベースにクエリを実行する必要があります。

これがアクティビティです(かなり多くのコードです)

    package com.scoremaster.pro;

import android.app.Dialog;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class ScheduleMain extends ListActivity implements OnItemClickListener,
        OnClickListener, OnItemLongClickListener {

    Dialog selectTeam, selectSeason, newSeason;
    Cursor teamInfo, seasons, scheduleInfo;
    ScoreMasterDB dbInfo;
    ListView diaList, diaSeason;
    int teamID, seasonID;
    String teamNameG;
    Button addNewSeason;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.schedule_main);

        selectTeam = new Dialog(ScheduleMain.this);
        selectTeam.setContentView(R.layout.schedule_main_dialog);
        selectTeam.setTitle("Select Team");

        dbInfo = new ScoreMasterDB(this);
        try {
            dbInfo.open();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        teamInfo = dbInfo.getTeamsCursor();
        startManagingCursor(teamInfo);

        if (teamInfo.getCount() == 0) {
            Intent createTeamIntent = new Intent(
                    "com.scoremaster.pro.CREATETEAM");
            createTeamIntent.putExtra("fromSchedule", true);
            startActivity(createTeamIntent);
        }

        String[] columns = { ScoreMasterDB.KEY_TEAMNAME };
        int[] to = { R.id.tvTeamSelectList };

        //Bundle scheduleBundle = getIntent().getExtras();
        //int whatToDo = scheduleBundle.getInt(")

        diaList = (ListView) selectTeam.findViewById(R.id.lvScheduleDialog);
        SimpleCursorAdapter teamListAdapter = new SimpleCursorAdapter(
                ScheduleMain.this, R.layout.team_select_list, teamInfo,
                columns, to);
        diaList.setAdapter(teamListAdapter);
        diaList.setOnItemClickListener(this);
        selectTeam.show();

    }

    // listview onClick events
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // TODO Auto-generated method stub
        switch (parent.getId()) {
        case R.id.lvScheduleDialog:
            selectTeam.dismiss();
            teamInfo.moveToPosition(position);

            // set data on ScheduleMain
            TextView teamName = (TextView) findViewById(R.id.tvScheduleTeam);
            TextView teamAbbrev = (TextView) findViewById(R.id.tvScheduleAbbrev);
            TextView teamLevel = (TextView) findViewById(R.id.tvScheduleLevel);
            LinearLayout layTeam = (LinearLayout) findViewById(R.id.layScheduleTeam);
            Button bAddSchedule = (Button) findViewById(R.id.bAddGame);

            teamNameG = teamInfo.getString(1);

            teamName.setText(teamInfo.getString(1));
            teamAbbrev.setText(teamInfo.getString(2));
            teamLevel.setText(teamInfo.getString(3));
            bAddSchedule.setText("Add Game to Schedule");
            bAddSchedule.setClickable(true);

            teamID = teamInfo.getInt(0);

            // set button if no team
            if (teamInfo.getCount() == 0) {

            }

            // set listeners for bAddGame and laySheduleTeam
            bAddSchedule.setOnClickListener(this);
            layTeam.setOnClickListener(this);

            // get season information
            selectSeason = new Dialog(ScheduleMain.this);
            selectSeason.setContentView(R.layout.schedule_season_dialog);
            selectSeason.setTitle("Select Season");
            seasons = dbInfo.getSeasonsCursor(teamID);
            startManagingCursor(seasons);

            String[] columns = { ScoreMasterDB.KEY_SEANAME };
            int[] to = { R.id.tvTeamSelectList };

            // set select season dialog listview elements
            diaSeason = (ListView) selectSeason
                    .findViewById(R.id.lvSeasonDialog);
            SimpleCursorAdapter seasonListAdapter = new SimpleCursorAdapter(
                    ScheduleMain.this, R.layout.team_select_list, seasons,
                    columns, to);
            diaSeason.setAdapter(seasonListAdapter);
            diaSeason.setOnItemClickListener(this);
            diaSeason.setOnItemLongClickListener(this);

            // set add button listenter
            Button addSeason = (Button) selectSeason
                    .findViewById(R.id.bAddSeason);
            addSeason.setOnClickListener(this);

            // show dialog
            selectSeason.show();
            break;
        case R.id.lvSeasonDialog:
            // get seasonID
            selectSeason.dismiss();
            seasons.moveToPosition(position);
            seasonID = seasons.getInt(0);

            // get schedule cursor
            scheduleInfo = dbInfo.getScheduleCursor(teamID, seasonID);
            startManagingCursor(scheduleInfo);
            //scheduleInfo.moveToFirst();

            //String[] columns1 = {ScoreMasterDB.KEY_SEANAME};
            //int[] to1 = {R.id.tvScheduleAddVsAt};
            //SimpleCursorAdapter scheduleAdapter = new SimpleCursorAdapter(ScheduleMain.this, R.layout.schedule_main_list, seasons, columns1, to1);
            ScheduleAdapter scheduleAdapter = new ScheduleAdapter(ScheduleMain.this, scheduleInfo);
            setListAdapter(scheduleAdapter);
            break;

        }

    }

    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.bAddSeason:
            selectSeason.dismiss();
            newSeason = new Dialog(ScheduleMain.this);
            newSeason.setContentView(R.layout.schedule_new_season);
            newSeason.setTitle("New Season");

            TextView teamName = (TextView) newSeason
                    .findViewById(R.id.tvNewSeasonTeamName);
            teamName.setText("Create new season for the " + teamNameG);

            addNewSeason = (Button) newSeason
                    .findViewById(R.id.bSubmitNewSeason);
            addNewSeason.setOnClickListener(this);
            newSeason.show();
            break;
        case R.id.bSubmitNewSeason:
            TextView seasonName = (TextView) newSeason
                    .findViewById(R.id.etNewSeasonName);
            String submitSeason = seasonName.getText().toString();
            if (submitSeason.equalsIgnoreCase("")) {
                Toast.makeText(ScheduleMain.this, "Please enter a season name",
                        Toast.LENGTH_SHORT).show();
            } else {
                try {
                    dbInfo.insertSeason(teamID, submitSeason);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    Intent intent = getIntent();
                    finish();
                    startActivity(intent);

                }
            }

            break;
        case R.id.bAddGame:
            Intent addGame = new Intent("com.scoremaster.pro.ADDGAME");
            addGame.putExtra("teamID", teamID);
            addGame.putExtra("seasonID", seasonID);
            startActivity(addGame);

            break;
        case R.id.layScheduleTeam:
            selectTeam.show();
            break;
        }

    }

    public boolean onItemLongClick(AdapterView<?> parent, View view,
            int position, long id) {
        // TODO Auto-generated method stub
        if (parent.getId() == R.id.lvSeasonDialog) {
            seasons.moveToPosition(position);
            int rowID = seasons.getInt(0);
            dbInfo.removeSeason(rowID);
            selectSeason.dismiss();
            Intent intent = getIntent();
            finish();
            startActivity(intent);
            return true;

        } else {
            return false;

        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
    }

}

DB クラスの getScheduleCursor() メソッドは次のとおりです。

    public Cursor getScheduleCursor(int teamID, int seasonID){
    String[] columnsSch = {KEY_ROWID, KEY_SCHHOMEAWAY, KEY_SCHOPPFK, KEY_SCHLOCATION,  KEY_SCHWHEN, KEY_SCHOUTCOME, KEY_SCHTYPE, KEY_SCHPLAYED}; 
    Cursor c = scoreMasterDB.query(DB_SCHEDULE_TABLE, columnsSch, KEY_SCHTEAMFK + "=" + teamID + " AND " + KEY_SCHSEASON + "=" + seasonID, null, null, null, null); 

    return c;
}
4

1 に答える 1

1

ではScheduleAdapter、ビューを膨張させるときinflate()に、ルート ビューにアタッチしないバージョンの を使用します。

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    // TODO Auto-generated method stub
    return mInflater.inflate(R.layout.schedule_main_list, parent, false);
}

また、ビューをバインドするときにデータベースへの新しい接続を作成して取得するのではなくteamName、元のカーソルに (とともにまたは置換して)を含める方がよいでしょう。新しい接続を作成して DB にクエリを実行するためです。mOppFKに追加されたすべてのアイテムに対してListView

編集:改善できること:

A)アクティビティ (および他のインターフェイス) を実装する代わりに、OnItemClickListener渡す必要がある場合は匿名型を使用しますsetOnItemClickListener

diaList.setOnItemClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });

B) a を実行するJOIN(そしてアダプタ内で新しい接続を開かないようにする) には、a を使用しSQLiteQueryBuilderてクエリ式を作成します。

SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables("foo LEFT OUTER JOIN bar ON (foo.id = bar.foo_id)")

Cursor cursor = qb.query(...);

C)ここで何をしようとしているのかわからない:

Intent intent = getIntent();
finish();
startActivity(intent);

活動を再開しますか?最初のダイアログをもう一度開いてみませんか?

D)この方法で新しいものを作成する方が快適だと思いますIntent

Intent createTeamIntent = new Intent(this, CREATETEAM.class));

リスナーの内部にいる場合はthis、コンテキストとして渡すために使用できません (アクティビティを参照しないため)。このような場合、アクティビティで属性を宣言できます。

Context context;

で初期化しOnCreateます:

this.context = this;

を呼び出すだけで、必要なときにいつでも使用できますcontext

于 2012-05-06T01:14:38.103 に答える