2012-05-30 49 views
0

我無法弄清楚這一點。這是我的第一款Android應用程序,所以請幫我和裸陪我是這樣一個小白....我仍然無法弄清sqlite結果的自定義遊標適配器

我有以下結構的SQLite表:

String CREATE_ACHIEVEMENTS_TABLE = "CREATE TABLE achievements (" 
      + "id INTEGER PRIMARY KEY," 
      + "name VARCHAR," 
      + "type VARCHAR," 
      + "value VARCHAR," 
      + "completed VARCHAR" 
      + ")"; 
現在

我試圖要做到這一點,以便如果「已完成」列設置爲「是」,我希望列表視圖中該行的文本顏色爲綠色。

我讀過教程,看了一下代碼示例,我只是不知道如何使用自定義cursoradapter實現這個。現在顯示在列表視圖我使用下面的代碼的結果:

ShowAchievements.java(點擊菜單項「查看成績」時,這項活動開始):

package com.dd.qsg; 

import java.util.ArrayList; 
import android.app.ListActivity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 

public class ShowAchievements extends ListActivity { 

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

     DatabaseHandler db = new DatabaseHandler(this); 
     ArrayList<String> achievements = db.getAchievements(this); 

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

} 

的getAchievements()函數被調用在上述活動:

public ArrayList<String> getAchievements(Context context) { 
    ArrayList<String> achievementList = new ArrayList<String>(); 
    String selectQuery = "SELECT * FROM achievements ORDER BY id asc"; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    if (cursor != null) { 
     if (cursor.moveToFirst()) { 
      do { 
       if (cursor.getString(4).equals("yes")) { 
        achievementList.add(cursor.getString(1)+" (completed)"); 
       } 
       else { 
        achievementList.add(cursor.getString(1)); 
       } 
      } while (cursor.moveToNext()); 
     } 
    } 
    else { 
     achievementList.add(context.getResources().getString(R.string.na)); 
    } 

    cursor.close(); 
    db.close(); 
    return achievementList; 
} 

就像我說我要實現自定義的CursorAdapter這樣,當我從我的ShowAchievements活動中調用getAchievements(),它將使文本綠色的顏色列表視圖行如果「com pleted「設置爲」yes「,表示數據庫中的該行。我希望這是有道理的。

在另一個問題,我問別人幫了我

,他們告訴我,來實現這樣的事情:

private class MyCursorAdapter extends CursorAdapter { 

    public MyCursorAdapter(Context context, Cursor c) { 
     super(context, c); 
    } 

    @Override 
    public void bindView(View v, Context context, Cursor cursor) { 
     if(cursor.getString(cursor.getColumnIndex("completed").equals("yes")){ 
      TextView tv = (TextView) v.findViewById(R.id.NAMEOFTEXTVIEW); 
      tv.setTextColor(Color.GREEN); 
     } 
    } 

    @Override 
    public View newView(Context arg0, Cursor arg1, ViewGroup arg2) { 
     LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = inflater.inflate(R.layout.achievement_item, parent, false); 
     return row; 
    } 
} 

我的問題是如何實現這一點,以便它工作時getAchievements()是從內部被稱爲我的活動?我必須添加什麼XML文件?我必須添加一個帶有listview的linearlayout的xml文件,然後是一個帶有linearlayout和textview的獨立xml文件嗎?或者我把textview放在與listview相同的佈局中?我是否用cursoradapter代碼替換了我的整個getAchievements()函數?

如果有人可以請我幫助我id很欣賞它。我真的不知道如何實現這一點。我嘗試閱讀一些教程,他們只是困惑了我很多。如果我能得到一個完整的例子或者某個東西來幫助我理解如何做到這一點,它會幫助我完成一個很好的例子。即時通訊不試圖要求某人爲我編寫所有的代碼,但是能夠幫助我準確掌握如何做到這一點的東西真的很棒。

回答

2

由於我無法重現你的開發環境,這是我所能做的重構代碼:

public class ShowAchievements extends ListActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     DatabaseHandler db = new DatabaseHandler(this); 
     Cursor cursor = db.getAchievements(this); 
     MyCursorAdapter cursorAdapter = new MyCursorAdapter(this, cursor); 

     this.setListAdapter(cursorAdapter); 
    } 

    private Cursor getAchievements(Context context) { 
     String selectQuery = "SELECT * FROM achievements ORDER BY id asc"; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     return db.rawQuery(selectQuery, null); 
    } 

    private class MyCursorAdapter extends CursorAdapter { 

     public MyCursorAdapter(Context context, Cursor c) { 
      super(context, c); 
     } 

     @Override 
     public void bindView(View v, Context context, Cursor cursor) { 
      if(cursor.getString(cursor.getColumnIndex("completed")).equals("yes"){ 
       TextView tv = (TextView) v.findViewById(R.id.NAMEOFTEXTVIEW); 
       tv.setTextColor(Color.GREEN); 
      } 
     } 

     @Override 
     public View newView(Context arg0, Cursor arg1, ViewGroup arg2) { 
      LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.achievement_item, parent, false); 
      return row; 
     } 
    } 
} 

請您嘗試一下,如果有固定的語法錯誤,讓我知道它是如何工作或不。

+0

我仍然不知道如何實施這個.... – scarhand

+0

看到我更新的答案。 – papaiatis

0

只是把空間之前,每個(「)爲您的sqlite的代碼,因爲它們彼此結合和代碼不能執行 使它像這樣:

String CREATE_ACHIEVEMENTS_TABLE = "CREATE TABLE achievements (" 
     + " id INTEGER PRIMARY KEY," 
     + " name VARCHAR," 
     + " type VARCHAR," 
     + " value VARCHAR," 
     + " completed VARCHAR" 
     + ")";