2012-03-02 12 views
0

Listviewを使用して講義を表示するアプリがあります。講義は、そのタイプによって色分けされています。カスタムアダプターを使用して、各講義のさまざまな色をコントロールしました。私は以下のコードを使用してアダプタを呼び出す -Listviewアダプタの問題

cursor = myDbHelper.getReadableDatabase().rawQuery(sql, null);  
    startManagingCursor(cursor); 
    adapter = new Lectures_Adapter(this,R.layout.menu_item,cursor,FROM,TO);   
    menuList.setAdapter(adapter); 

私が講義を注文し直すまでは、すべての場所で言う、[OK]を動作します。私が使用するコードがある - 私のカスタムアダプタ(Lectures_Adapter)で

Cursor newCursor = myDbHelper.getReadableDatabase().rawQuery(sqlStr, null); 
    adapter.changeCursor(newCursor); 

のコードは以下の通りですが、講義が再順序付けされたときに呼び出されません。

 public class Lectures_Adapter extends SimpleCursorAdapter { 
     private Context appContext; 
     private int layout; 
     private Cursor mycursor; 

     public Lectures_Adapter(Context context, int layout, Cursor c, String[] from,int[] to) { 
       super(context, layout, c, from, to); 
       this.appContext=context; 
       this.layout=layout; 
       this.mycursor=c;    
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent)  
     { 
       View view = super.getView(position, convertView, parent); 
       try {    
       if (position > 0) 
       {    
        RelativeLayout rowFill = (RelativeLayout) convertView.findViewById(R.id.rowFill); 
        String title = mycursor.getString(1);     
        int myColor = 0; 
        int myPos = title.indexOf("Nursing"); 
        int myPos2 = title.indexOf("Masterclass"); 
        if (myPos >= 0) 
        { 
         myColor = Color.parseColor("#99FF66"); 
        } 
        else if (myPos2 >= 0) 
        { 
         myColor = Color.parseColor("#FF99FF"); 
        } 
        else 
        { 
         myColor = Color.parseColor("#FFFF66"); 
        } 
        convertView.findViewById(R.id.rowFill).setBackgroundColor(myColor);     
        }   
       }catch(Exception e) { 

       } 

       if (convertView == null) { 
        LayoutInflater inflator = (LayoutInflater) this.appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        convertView = inflator.inflate(this.layout,null); 
       } else { 
        convertView = (View) convertView; 
       } 
       return view; 
      } 

     } 

誰かが私は動的に私のリストビューを注文し直すと、その都度、アダプタのカスタム私を呼び出すことができる方法を教えてくださいすることができます。

+0

どのように再注文していますか?それはいくつかのクリックか? – kosa

+0

私は、ユーザーにデータを注文する4つの方法のオプションを与えるダイアログボックスを持っています。それらが選択されると、上記のコードに新しいクエリを渡します(カーソルはmyDbHelper.getReadableDatabase()にあります)。rawQuery(sql、null);) – user616076

答えて

1

問題は、getView()のコードはクラス変数mycursorからデータを取得しますが、changeCursorを呼び出すとmycursor変数が更新されないため、元のリストは引き続き表示されます。 mycursorを使用する代わりに、代わりにgetCursor()に電話する必要があります。

+0

コードを変更しました。adapter.changeCursor(newCursor); 〜adapter.getCursor(); getViewのコードは決して使用されません。私は他の何かをしなければなりませんか? – user616076

+0

getCursor()を呼び出すgetView funcのコードを変更する必要があります。changeCursorの呼び出しを置き換えません。 – superfell

+0

ありがとうございました。別の小さな問題があります。最初のページのみで、最初の行は色づけされ、残りの行は色付けされません。ただし、下にスクロールしてからスクロールすると、すべての行が色付けされます。デバッグを使用してステップ実行すると、行に色が割り当てられますが、画面が最初に表示されたときには適用されないようです。 – user616076

0

changeCursorを呼び出した後にadapter.notifyDataSetChanged()を呼び出してみましたか?それはあなたのmenuListを更新する必要があります。

+0

お返事ありがとうございます。私はあなたがそう示唆したコードを追加しようとしました - adapter.changeCursor(newCursor); adapter.notifyDataSetChanged();しかし、現在getViewを実行していますが、エラー 'staledataexception - アクセスが閉じたカーソル'になります – user616076

0

代わりに、getViewを使用する代わりに、newViewとbindViewメソッドを使用することができます。ここでは、私が書いたコードの例を示します。

private static class ViewHolder { 
    HistoryRowView rowvw; 
} 

class ReportHistoryAdapter extends CursorAdapter { 
    ViewHolder _holder; 

    private static final String INFLATER_SVC = Context.LAYOUT_INFLATER_SERVICE; 
    private LayoutInflater _inflater; 

    public PostureReportAdapter(Context context, Cursor cursor) { 
     super(context, cursor); 
     _inflater = (LayoutInflater) context.getSystemService(INFLATER_SVC); 

    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View vw = _inflater.inflate(R.layout.reports_history_view, null); 
     _holder = new ViewHolder(); 
     _holder.rowvw = (HistoryRowView)vw.findViewById(R.id.rhv_history_row_vw); 
     vw.setTag(_holder); 
     return vw; 
    } 

    @Override 
    public void bindView(View vw, Context context, Cursor cursor) { 
     _holder = (ViewHolder)vw.getTag(); 

     int poor = cursor.getInt(0); 
     int fair = cursor.getInt(1); 
     int good = cursor.getInt(2); 
     int date = cursor.getInt(3); 

     _holder.rowvw.setData(poor, fair, good, date); 
    } 
} 
関連する問題