0

おそらく単純なものが欠けているだけですが、ここにあります。

目的: ListView が各行内のボタンのビューと onClick を作成するときに、SQLite DB の行を更新します。

最初の更新の問題: 紫色のボックス内の数字は、「能力」SQLite テーブルからデータ (整数) を正常に取得します (再インストールしたばかりなので、例ではゼロ)。ただし、ListView の各行でその数字を取得し、「スキル」テーブルを更新します。ビューが作成されたとき。最初の「if」にコードを配置して、他の5回繰り返す前に動作することをテストしました。

2 番目の更新の問題: 「+」ボタンの onClick で、ボタンの左側の数字が 1 増加し、色付きの数字と setText を左端のゼロに追加します。下にスクロールしてから上にスクロールすると、行がビューをリセットします。onClick() の最後に notifyDataSetChanged() を指定すると、代わりに何も起こりません。どちらの場合も、データベースは更新されません。

これらのイベントはどちらもテーブルを更新しておらず、コンパイラまたはランタイムでエラーを受け取っていません。

どんな助けでも大歓迎です!追加のコード/情報が必要な場所を尋ねてください。

DatabaseHandler クラス:

private static final String tableSkill = "skill";
private static final String colSkillId = "sID"; // and so on
public int updateSkill(Skill skill) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(colSkillId, skill.getSkillId());
    values.put(colSkillMod, skill.getSkillMod());
    values.put(colSkillAbil, skill.getSkillAbil());
    values.put(colSkillRank, skill.getSkillRank());
    values.put(colSkillMisc, skill.getSkillMisc());
    // updating row
    return db.update(tableSkill, values, colSkillId + " = ?",
            new String[] { String.valueOf(skill.getSkillId()) });
}

スキルクラス:

public Skill(int skillId, int skillMod, int skillAbil, int skillRank, int skillMisc){
    this._skillId = skillId;
    this._skillMod = skillMod;
    this._skillAbil = skillAbil;
    this._skillRank = skillRank;
    this._skillMisc = skillMisc;
}
public int getSkillId(){
    return this._skillId;
}

public void setSkillID(int skillId){
    this._skillId = skillId;
} // and so on for the other 4

SkillAdapter クラス:

public class SkillAdapter extends BaseAdapter {
private Context context;
private ArrayList<Skill> skillList;
private DatabaseHandler db;
private int id;
private int mod;
private int rank;
private int abil;
private int misc;

public SkillAdapter(Context context, ArrayList<Skill> list) {
    this.context = context;
    skillList = list;
}

@Override
public int getCount() {
    return skillList.size();
}

@Override
public Object getItem(int position) {
    return skillList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup arg2) {
    Skill skill = skillList.get(position);
    ViewHolder holder = new ViewHolder();

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.lay_skills_row, null);
    }

    db = new DatabaseHandler(context);
    holder.sID = (TextView)convertView.findViewById(R.id.skill_ID);
    holder.sName = (TextView)convertView.findViewById(R.id.skill_name);
    holder.sKey = (TextView)convertView.findViewById(R.id.skill_key);
    holder.sMod = (TextView)convertView.findViewById(R.id.skill_total);
    holder.sAbil = (TextView)convertView.findViewById(R.id.skill_abil);
    holder.sRanks = (TextView)convertView.findViewById(R.id.skill_ranks);
    holder.sMisc = (EditText)convertView.findViewById(R.id.skill_misc);
    holder.sButton = (Button)convertView.findViewById(R.id.skill_button);
    holder.sButton.setTag(holder);
    holder.sButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ViewHolder holder1 = (ViewHolder)v.getTag();
            id = Integer.parseInt(holder1.sID.getText().toString());
            rank = Integer.parseInt(holder1.sRanks.getText().toString());
            misc = Integer.parseInt(holder1.sMisc.getText().toString());
            rank = rank + 1;
            abil = Integer.parseInt(holder1.sAbil.getText().toString());
            mod = rank + abil;
            holder1.sRanks.setText("" + String.valueOf(rank));
            holder1.sMod.setText(String.valueOf(mod));
            db.updateSkill(new Skill(id, mod, abil, rank, 0)); // ISSUE 2
        }
    });

    holder.sID.setText(String.valueOf(skill.getSkillId())); // OK
    holder.sName.setText(skill.getSkillName()); // OK
    holder.sKey.setText(skill.getSkillKey()); // OK
    holder.sMod.setText(String.valueOf(skill.getSkillMod())); 
    holder.sRanks.setText(String.valueOf(skill.getSkillRank()));
    holder.sMisc.setText(String.valueOf(skill.getSkillMisc()));

    if(skill.getSkillKey().contentEquals("STR") == true){
        holder.sAbil.setText(""+db.getAbilityMod("STR"));
        abil = Integer.parseInt(db.getAbilityMod("STR"));
        holder.sAbil.setBackgroundColor(Color.parseColor("#e60000"));
        db.updateSkill(new Skill(skill.getSkillId(), skill.getSkillMod(), abil, rank, misc));} // ISSUE 1
    else if (skill.getSkillKey().contentEquals("DEX") == true){
        holder.sAbil.setText(""+db.getAbilityMod("DEX"));
        holder.sAbil.setBackgroundColor(Color.parseColor("#0073e6"));}
        // will also have db.updates once I know the first one works
    else if (skill.getSkillKey().contentEquals("CON") == true){
        holder.sAbil.setText(""+db.getAbilityMod("CON"));
        holder.sAbil.setBackgroundColor(Color.parseColor("#00e673"));}
    else if (skill.getSkillKey().contentEquals("INT") == true){
        holder.sAbil.setText(""+db.getAbilityMod("INT"));
        holder.sAbil.setBackgroundColor(Color.parseColor("#e600e6"));}
    else if (skill.getSkillKey().contentEquals("WIS") == true){
        holder.sAbil.setText(""+db.getAbilityMod("WIS"));
        holder.sAbil.setBackgroundColor(Color.parseColor("#e67300"));}
    else if (skill.getSkillKey().contentEquals("CHA") == true){
        holder.sAbil.setText(""+db.getAbilityMod("CHA"));
        holder.sAbil.setBackgroundColor(Color.parseColor("#e6e600"));}      
    return convertView;
}

static class ViewHolder{
    Skill skill;
    TextView sID;
    TextView sName;
    TextView sKey;
    TextView sMod;
    TextView sAbil;
    TextView sRanks;
    EditText sMisc;
    Button sButton; 
}}
4

1 に答える 1

0

これが遅れている可能性があることはわかっていますが、データベースの更新の一部としてコンテンツ値から列 ID を削除してみて、問題 2 が解決するかどうかを確認してください。

問題#1の場合、getView()メソッドでは、値を使用してデータベースを一度更新し、次に押すunmodified/non-instantiatedたびに更新しているようです。sButtonその理由はありますか?最初に変数をインスタンス化するか、目的のボタンが押されたときにのみデータベースを更新することができます。

于 2014-07-15T11:51:42.107 に答える