2010-11-26 3 views
5

Cursor의 정보를 ListView에 표시하려고하는데 각 행에 ImageViewTextView이 포함되어 있습니다. 나는 CustomCursorAdapterCursorAdapter까지 확장하고 있습니다. bindView 커서의 데이터를 평가하고 뷰 이미지와 텍스트를 설정합니다.CursorAdapter를 재정의하는 방법 bindView

앱을 실행할 때 ListView은 정확한 양의 행을 표시하지만 비어 있습니다. 나는 bindView를 재정의 할 때 뭔가를 놓쳤다는 것을 알고 있지만 무엇이 확실하지가 않다.

도움을 주시면 감사하겠습니다.

private class CustomCursorAdapter extends CursorAdapter { 

    public CustomCursorAdapter() { 
    super(Lmw.this, monitorsCursor); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    LayoutInflater layoutInflater = getLayoutInflater(); 

    return layoutInflater.inflate(R.layout.row, null); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
    try { 
     int monitorNameIndex = cursor.getColumnIndexOrThrow(DbAdapter.MONITORS_COLUMN_MONITOR_NAME); 
     int resultTotalResponseTimeIndex = cursor.getColumnIndexOrThrow(DbAdapter.RESULTS_COLUMN_TOTAL_RESPONSE_TIME); 

     String monitorName = cursor.getString(monitorNameIndex); 
     int warningThreshold = cursor.getInt(resultTotalResponseTimeIndex); 

     String lbl = monitorName + "\n" + Integer.toString(warningThreshold) + " ms"; 

     TextView label = (TextView) view.findViewById(R.id.label);  
     label.setText(lbl); 

     ImageView icon = (ImageView)view.findViewById(R.id.icon); 
     if(warningThreshold < 1000) { 
     icon.setImageResource(R.drawable.ok);  
     } else { 
     icon.setImageResource(R.drawable.alarm); 
     } 


    } catch (IllegalArgumentException e) { 
     // TODO: handle exception 
    } 
    } 
} 
+0

나는 이것을 나중에 시도 할 것이지만, 1 개의 코멘트 : 생성자에서이'cursor.getColumnIndexOrThrow (DbAdapter.MONITORS_COLUMN_MONITOR_NAME);'호출을해야한다. 당신은'Log.e' 예외는 어떨까요? –

답변

4

bindView() 방법이 좋습니다. 성능상의 이유로

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    return mInflater.inflate(R.layout.row, parent, false); 
} 

그리고, :

당신의 newView를 교체하십시오() 방법 모든 cursor.getColumnIndexOrThrow() 통화와 생성자

  • 같은 일에

    • 이동 getLayoutInflater(), 을 으로 지정하고을 의견
    • 는 텍스트 당신의 LBL 만들기위한 모두 StringBuilder를 사용
    • 가지는 Integer.toString (warningThreshold)을 할 필요가 없습니다
    • ... 단지 warningThreshold

    나중에 편집을 사용하여 : inflate() 메서드와 내가 제안한 것과 유일한 차이점은이 레이아웃 매개 변수를 만드는 것입니다. 부모님.

  • +0

    실제로 내 SQL에서 오류가 발생했습니다. 'RESULTS_COLUMN_TOTAL_RESPONSE_TIME'열이 커서에 없습니다. 성능 문제에 대한 의견을 보내 주셔서 감사합니다. 당신의 대답을 옳은 것으로 표시 할 것입니다. – Holm

    관련 문제