2011-11-21 32 views
2

我使用的是SimpleAdapter R.layout.list_cibo的改变颜色的ListView与SimpleAdapter

ArrayList<Recipe> ciboList = null; 

    ArrayList<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>(); 

    for(int i=0;i<ciboList.size();i++){ 
     // Recipe is my own class defined in another java 
     Recipe r = (Recipe) ciboList.get(i); 

     HashMap<String,Object> ricettaMap = new HashMap<String, Object>(); 

     // Informations loaded from Recipe.java 
     ricettaMap.put("tipo", r.getTipo()); 
     ricettaMap.put("titolo", r.getTitolo()); 
     ricettaMap.put("difficolta", r.getDifficolta()); 
     ricettaMap.put("tempo", r.getTempo()); 
     ricettaMap.put("persone", r.getPersone()); 
     ricettaMap.put("ingredienti", r.getIngredienti()); 
     ricettaMap.put("vino", r.getVino()); 
     ricettaMap.put("consigli", r.getConsigli()); 
     ricettaMap.put("preparazione", r.getPreparazione());    

     }   
    } 

    String[] from = {"tipo", "titolo", "difficolta", "tempo", "ingredienti", "vino", "consigli", "preparazione", "persone"}; 
    int[] to = {R.id.ricettaTipo, R.id.ricettaTitolo, R.id.ricettaDifficolta, R.id.ricettaTempo, R.id.ricettaIngredienti, R.id.ricettaVino, R.id.ricettaConsigli, R.id.ricettaPrep, R.id.ricettaPersone}; 

    SimpleAdapter adapter = new SimpleAdapter(
      this, 
      data, 
      R.layout.list_cibo, 
      from, 
      to); 

XML填充一个ListView

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="50dip" 
android:padding="5dip" 
android:gravity="right"> 
<TextView 
    android:text="Titolo Ricetta" 
    android:singleLine="true"  
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_marginLeft="5dip" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:scrollHorizontally="false" 
    android:id="@+id/ricettaTitolo"> 
</TextView> 
<TextView 
    android:text="Difficoltà" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:textColor="#FF0000" 
    android:layout_marginLeft="5dip" 
    android:layout_alignParentBottom="true" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/ricettaDifficolta" 
    android:singleLine="true" 
    android:scrollHorizontally="false"> 
</TextView> 
<TextView 
    android:text="Tempo" 
    android:layout_toRightOf="@+id/ricettaDifficolta" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:textColor="#FF3300" 
    android:layout_marginLeft="20dip" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/ricettaDifficolta" 
    android:gravity="right" 
    android:id="@+id/ricettaTempo" 
    android:layout_width="fill_parent"> 
</TextView> 
<TextView 
    android:id="@+id/ricettaTipo" 
    android:visibility="gone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
</TextView> 
<TextView 
    android:id="@+id/ricettaPersone" 
    android:visibility="gone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
</TextView> 
<TextView 
    android:visibility="gone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:id="@+id/ricettaIngredienti"> 
</TextView> 
<TextView 
    android:visibility="gone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:id="@+id/ricettaVino"> 
</TextView> 
<TextView 
    android:id="@+id/ricettaConsigli" 
    android:visibility="gone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
</TextView> 
<TextView 
    android:id="@+id/ricettaPrep" 
    android:visibility="gone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
</TextView> 
    </RelativeLayout> 

我用三个不同的SimpleAdapter创建三个基于三种不同颜色的不同列表;根据参数,我想要做的只是创建一个列表,以三种颜色中的一种颜色对每个项目着色。

我试过使用.setColor修改TextViews,但它不起作用。

+0

发布您如何设置颜色的代码。 –

+0

代码在SimpleAdapter adapter = new SimpleAdapter声明中设置 – Mangusto

回答

7

采取有内部SimpleAdapter该方法。它叫做ViewBinder。尝试在此之后立即包含此行代码: SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_cibo, from, to);”“setListAdapter(adapter);之前。

SimpleAdapter.ViewBinder binder = new SimpleAdapter.ViewBinder() { 
@Override 
public boolean setViewValue(View view, Object object, String value) { 
System.out.println("view= "+view); 
    System.out.println("view.toString()= "+ view.toString()); 
    System.out.println("view.getId()= "+ view.getId()); 
    System.out.println("view.getVisibility()= "+ view.getVisibility()); 
    System.out.println("view.equals((TextView) view.findViewById(R.id. ricettaTipo))= "+ view.equals((TextView) view.findViewById(R.id. ricettaTipo))); 
    if (view.equals((TextView) view.findViewById(R.id.ricettaTipo))) 
      { 
       TextView ricetta = (TextView) view.findViewById(R.id.ricettaTipo); 
        //Change color/answer/etc for ricettaTipo 
      } 

//OR 
      if (view instanceof TextView) { 
        //Do stuff 
        return true; 
       } 

       return false; 
      } 
      }; 
adapter.setViewBinder(binder); 

setListAdapter(adapter);  

setViewValue方法将被调用用于每个R.id.ricettaTipo, R.id.ricettaTitolo, R.id.ricettaDifficolta, R.id.ricettaTempo, R.id.ricettaIngredienti, R.id.ricettaVino, R.id.ricettaConsigli, R.id.ricettaPrep, R.id.ricettaPersone.The setViewValue方法将被调用每个View /每次正在绘制上述R.id’s之一。

+0

这就是答案!谢谢 ! – Jerry

+0

这应该是被接受的答案,因为这个答案与问题更相关,它确实为我节省了很多麻烦。 – Milanor

+0

谢谢!只需投票。 – Gene

1

为什么不尝试使用自定义适配器类(可能是配方适配器)来扩展SimpleAdapter类,并覆盖getView(int position,View convertView,ViewGroup parent)方法。

 public View getView(int position, View convertView, ViewGroup parent) { 
      return createViewFromResource(position, convertView, parent, mResource); 
     } 

     private View createViewFromResource(int position, View convertView, 
       ViewGroup parent, int resource) { 
      View v; 
      if (convertView == null) { 
       v = mInflater.inflate(resource, parent, false); 
       /* set a background color depending on the recipe shown in this table 
       * row you will have to include a recipe.getType() method 
       * to determine the necessary color 
       * v.setBackgroundColor(R.color.your_favourite_color) 
       */   

       final int[] to = mTo; 
       final int count = to.length; 
       final View[] holder = new View[count]; 

       for (int i = 0; i < count; i++) { 
        holder[i] = v.findViewById(to[i]); 
       } 

       v.setTag(holder); 
      } else { 
       v = convertView; 
      } 

      bindView(position, v); 

      return v; 
     } 

的代码是从grepcode

+0

感谢您的详细解答,请告知我是否正确:我创建了一个定义我的SimpleAdapter的新类,然后使用该类重写了现有类的视图我定义了? – Mangusto