2013-04-23 3 views
1

상태가 다른 SQLite 주문 목록이 있습니다 : 할당 됨,로드 됨, 배달 됨. 목록에 표시 될 때 각 주문에 대해 다른 색칠 된 배경을 갖고 싶습니다. 지금까지 나는 이것을 할 수있는 좋은 방법을 찾지 못했습니다.각 항목에 표시되는 데이터를 기반으로 목록 항목의 배경색을 변경하려면 어떻게해야합니까?

위치를 기준으로 목록 항목의 배경색을 변경하는 방법에 대해서는 많은 논의가 있었지만 데이터 내용은 기반으로하지 않았습니다. 선택한 항목을 강조 표시하는 데 사용되는 색상을 변경하는 방법에 대한 토론도 많이있었습니다. 이것들은 나를 도와주지 않습니다.

내 문제를 해결하기 위해 생각해내는 유일한 방법은 전체 목록을 실행하고, 어댑터에 의해 생성 된 후 각 항목에 배경을 설정하는 것입니다. 응석과 낭비. 목록이 커서에서 생성 될 때 어댑터에서 배경을 변경할 수있는보다 효율적인 방법이 필요합니다.

더 좋은 방법이있을 것입니다. 나는 그것을 알기 위해 안드로이드에 너무 새롭다.


정말 고맙습니다. 나는 그들을 통합하기 위해 최선을 다하고 있지만, 나는 아직 성공하지 못하고있다. 여기에 내가 얻은 답과 내가 한 연구에 기초하여 방금 시도한 것이 있습니다.

public class OrderListAdapter extends SimpleCursorAdapter { 

    private static final String TAG = "SimpleCursorAdapter"; 
    Context _context = null; 
    int layoutResourceId = 0; 

    public OrderListAdapter(Context context, int layout, Cursor c, 
      String[] from, int[] to, int flags) { 
     super(context, layout, c, from, to, flags); 
     _context = context; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = super.getView(position, convertView, parent); 
     String tag = TAG + ".getView()"; 
     Log.d(tag,"in getView()"); 

     if (view == null) { 
      LayoutInflater inflater = ((Activity)_context).getLayoutInflater(); 
      view = inflater.inflate(R.layout.fragment_order_list_row, null); 
     } 
     setRowColor(view); 
     return view; 
    } 

    private void setRowColor(View view) { 
     String tag = TAG + ".setRowColor()"; 
     Cursor cursor = getCursor(); 
     int col = cursor 
       .getColumnIndex(DBContract.DeliveryOrderTable.ENROUTE_FLAG); 
     String enroute_flag = cursor.getString(col); 
     Log.d(tag, "enroute_flag = [" + enroute_flag + "]"); 
     col = cursor 
       .getColumnIndex(DBContract.DeliveryOrderTable.DELIVERED_DATETIME); 
     String deliveredDateStr = cursor.getString(col); 
     Log.d(tag, "deliveredDateStr = [" + deliveredDateStr + "]"); 
     int bgColorId = 0; 
     if (!deliveredDateStr.equals("")) { 
      bgColorId = R.color.bg_status_delivered_color; 
      Log.d(tag, "Setting to delivered color"); 
     } else if (enroute_flag.startsWith("T") || enroute_flag.startsWith("Y")) { 
      Log.d(tag, "Setting to enroute color"); 
      bgColorId = R.color.bg_status_enroute_color; 
     } else { 
      Log.d(tag, "Setting to assigned color"); 
      bgColorId = R.color.bg_status_assigned_color; 
     } 
     view.setBackgroundColor(_context.getResources().getColor(bgColorId)); 
    } 
} 

불행히도, 이것은 작동하지 않습니다. super.getView()를 호출하지 않으면 명시 적으로 전송을하지 않기 때문에 필자는 필드에 데이터가 없다는 것을 알았지 만 반환 된 뷰를 수정할 수 있다고 생각했습니다.

내 흔적은 데이터를 읽었 음을 보여 주지만 배경색은 변함이 없습니다.

변경하려고하는 뷰는 LinearLayout이지만 배경색을 변경하면 작동하지 않는 것으로 보입니다.

알 수 있습니다. 모든 자식 뷰의 배경을 투명하게 만들어야합니다.

+0

가능한 복제 ListView에서 특정 행의 배경색을 어떻게 바꿀 수 있습니까? (Android)] (http://stackoverflow.com/questions/4634796/how-can-i-change-the-background-color-for-an-specific-row-properly-in-a-listview) – Simon

+0

내가 보았다. 저것에. 그러나 행의 데이터가 아니라보기가있는 위치에 따라 색상을 변경하는 것처럼 보입니다. 그것은 내가 일하고 있다는 아이디어를 주었기 때문에 해결책이 될 수는 있겠지만 필요한 것이 아닙니다. – Rben

+0

다른 가능한 해결책으로 [속성에 따라 배경색 변경] (http://stackoverflow.com/questions/13967788/change-background-color-based-on-property)도 조사하고 있습니다. 어댑터의 작동 방식에 대해 자세히 알아보십시오. – Rben

답변

2

listview에 대한 사용자 지정 어댑터를 사용하는 경우 getView() 메서드를 사용하여 반환하기 전에 메서드를 호출하고 변경할 뷰 (돌아 오는 중)와 데이터를 전달할 수 있습니다 행의 색

public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View view = convertView; 
    if (view == null) { 
     LayoutInflater vi = (LayoutInflater) _c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = vi.inflate(R.layout.list_item_var, null); 
    } 

    TextView varView = (TextView) view.findViewById(R.id.var); 
    TextView valueView = (TextView) view.findViewById(R.id.value); 

    VarDetails var = _data.get(position); 
    setRowColor(view, var.getVar()); 
    varView.setText(var.var); 
    valueView.setText("Value: " + var.value); 

    return view; 
} 
private void setRowColor(View view, String var) { 
    if("assigned".equalsIgnoreCase(var)){ 
     view.setBackgroundColor(Color.rgb(255,0,0)); 
    }else if("loaded".equalsIgnoreCase(var)){ 
     view.setBackgroundColor(Color.rgb(0,255,0)); 
    }else if("delivered".equalsIgnoreCase(var)){ 
     view.setBackgroundColor(Color.rgb(0,0,255)); 
    } 
} 

데이터 유형에 따라 변경하십시오.

+0

이것은 매우 도움이되었습니다. 나는 그곳의 대부분의 방법 인 것처럼 보이지만 어떤 이유로 뷰의 배경색을 바꿀 때 그럴 필요가 없습니다. – Rben

+0

에 지금 문제가 해결 되었습니까? – umesh

1

ListView로 데이터베이스를 바인딩하기 위해 CursorAdapter를 확장하려고합니다. 그런 다음 ListView.dispatchDraw()를 재정 의하여 Paint 객체를 사용자 정의 할 수 있습니다.

아니면이이를 확인하는 것이 도움이 : Customizing Android ListView Items with Custom ArrayAdapter

은 기상 상태에 따라 다른 이미지를 사용합니다. 문제에 이식하면 페인트에서 물건을 변경하는 대신 9 패치 또는 프로그래밍 방식으로 만든 Drawables를 배경으로 사용할 수 있습니다.

+0

이것은 또한 상당히 도움이되었습니다. 고맙습니다. – Rben

관련 문제