2010-12-20 11 views
0

私はプロのコーダーではありません。私はプロのコーダーではありませんが、私はアンドロイド開発の基本を学ぶための簡単なリストを持っています。ListViewの色の問題

私は仕事をしたいと思っているものすべてを手に入れることができましたが、私のリストビューには完全に困惑している問題が1つあります。私はSimpleCursorAdapterを拡張してsqliteデータベースからのデータをフォーマットし、duedateが期限切れになったかどうかに基づいてduedateテキストの色を変更しました。書式設定は完璧に機能しますが、私は色で奇妙な結果を得ています。

私が期待しているように、リストビューの最初の数エントリが表示されますが、下にスクロールすると、期限が設定されていないアイテムが赤または緑に変わります。リスト内を上下にスクロールするほど、最終的にすべての行が色付けされるかどうかにかかわらず、より多くの不一致が表示されます。

ここで何が起こっているのか誰かに教えてもらえますか?私のカスタムアダプターをご覧ください。

public class ProAdapter2 extends SimpleCursorAdapter { 
    private static int[] TO = {R.id.priority, R.id.projectname, R.id.duedate}; 
    private static String[] FROM = {"priorities", "projectName", "dueDate"}; 
    private Context context; 
    private int layout; 

    //constructor 
    public ProAdapter2(Context context, int layout, Cursor c) { 
    super(context,layout, c, FROM, TO); 
    this.context=context; 
    this.layout = layout; 
    }  

    @Override 
    public View newView(Context context, Cursor curso, ViewGroup parent){ 
    Cursor c = getCursor(); 
    final LayoutInflater inflater = LayoutInflater.from(context); 
    View v = inflater.inflate(layout, parent, false); 
    TextView txtName = (TextView) v.findViewById(R.id.projectname); 
    txtName.setText(c.getString(1)); 
    TextView txtPriority = (TextView) v.findViewById(R.id.priority); 
    txtPriority.setText(c.getString(2)); 

    return v; 
    } 

    @Override 
    public void bindView(View v, Context context, Cursor c) { 
    TextView txtDueDate = (TextView) v.findViewById(R.id.duedate); 
    TextView txtDueDateLabel = (TextView) v.findViewById(R.id.duedate_label); 
    TextView txtPriority = (TextView) v.findViewById(R.id.priority); 
    TextView txtPriorityLabel = (TextView) v.findViewById(R.id.priority_label); 
    TextView txtName = (TextView) v.findViewById(R.id.projectname); 

    LinearLayout pridate = (LinearLayout) v.findViewById(R.id.pridate); 

    String dueDate = c.getString(3); 
    String cDate = c.getString(4); 
    String dueDateFormated; 

    MyTime t = new MyTime(); 
    Long cTimeLong = c.getLong(6); 
    Long dTimeLong = c.getLong(5); 

    dueDateFormated = t.getFormatedTime(c.getString(3));  
    txtDueDate.setText(dueDateFormated); 

    if (c.getInt(5)==0){ 
     txtDueDate.setText("Not Set"); 
    } 
    else if (cTimeLong < dTimeLong){  
     txtDueDate.setTextColor(Color.GREEN); 
    } 
    else if (cTimeLong > dTimeLong){ 
     txtDueDate.setTextColor(Color.RED); 
    } 
    } 
} 

image http://i.stack.imgur.com/bt4Z8.png

+0

他の条件ならばuがでやっていることを理解していませんでした?あなたは説明することができます.. – viv

+0

私のデータベースは、1970年1月1日からの経過時間を、Unixのエポックタイムフォーマットで保存します.SQLはまた、Unixのエポックタイムで現在の時刻を取得しやすくします。どちらが古いかを把握する。 – user548369

答えて

0

最も簡単な解決策はtxtDueDate.setText("Not Set");後に以下を追加することです:

txtDueDate.setTextColor(Color.BLACK); 

理由はListViewはあなたがnewView方法で作成Viewオブジェクトをリサイクルすることです。

bindViewが呼び出されたときに、vパラメータは常にピカピカ新しいViewオブジェクトではありませんが、これ以上表示されていないリストの一番上から事実1で、そのため以前に緑または赤のテキストを持っていました。

したがって、必要なすべてのプロパティ(テキストの色など)を明示的に設定する必要があります。

これ以外にも、最適化を行うことができます。たとえば、newViewメソッド—でsetTextを呼び出すべきではありません。これはバインドメソッドでのみ行う必要があります。 ListView作品は、あなたがこの話を見たり、PDFのスライドを見ることができます方法についていくつかの良い情報については


http://www.google.com/events/io/2010/sessions/world-of-listview-android.html

+0

それはそれをしました!私はこれを数時間おきに戦ってきたが、それは結局私がそれを理解すると思ったが、なぜこれが起きたのか分かりませんでした。リサイクルビューは、私がListViewについて多くの質問に答えた、ありがとう。これは私の最初の投稿です、これを閉じたり、解決したとマークする方法がありますか? – user548369

+0

uはこのユーザーの回答を受け入れることができます...... – viv