2013-09-24 29 views
3

我有我的应用程序的一个问题: 我用一个ListView具有个性化的适配器, 在此适配器我想改变这取决于线的颜色消息是否是读还是不。个性化列表视图错误

在方法GETVIEW我控制一个变量,如果它等于0我想改变背景颜色。

所有的作品和显示的列表,因为我想,

,但是当有很多的元素,并将列表中的任何方向(从顶部到底部,反之亦然)滚动的原糖与displeyed即使通过代码设置相同的颜色另一种颜色。

有没有人有过同样的问题? 你可以告诉我一些关于它的事情吗?

还有就是我的适配器代码:

public class LazyAdapterComunicazioni extends BaseAdapter { 

    private Activity activity; 
    private String[] id; 
    private String[] titolo; 
    private String[] data; 
    private String[] letto; 
    private static LayoutInflater inflater=null; 
    //public ImageLoader imageLoader; 

    public LazyAdapterComunicazioni(Activity a, String[] idCom, String[] titoloCom,  String[] dataCom, String[]lettoCom) { 
     activity = a; 
     id = idCom; 
     titolo = titoloCom; 
     data = dataCom; 
     letto = lettoCom; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return id.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View vi = convertView; 

     if(convertView == null) 
     { 
      vi = inflater.inflate(R.layout.comunicazionicslist, null); 
     } 

     ContactsViewHolder viewHolder = new ContactsViewHolder(); 

     //Settimane 
     viewHolder.txtTitolo=(TextView)vi.findViewById(R.id.comCS_Titolo); 
     viewHolder.txtTitolo.setText(titolo[position].toString()); 

     //Data 
     viewHolder.txtData=(TextView)vi.findViewById(R.id.comCS_Data); 
     viewHolder.txtData.setText(data[position].toString()); 

     //ID 
     viewHolder.txtID=(TextView)vi.findViewById(R.id.comCS_ID); 
     viewHolder.txtID.setText(id[position].toString()); 

     //Connessianne e Apretura del DB 
     String read = letto[position].toString(); 

     if (read.equals("0")) //DA LEGGERE 
     { 
      //LAYOUT 
      viewHolder.rel = (RelativeLayout)vi.findViewById(R.id.comCS_RIGA); 
      viewHolder.rel.setBackgroundResource(R.drawable.sfondorigacomcs); 
      viewHolder.txtTitolo.setTextColor(Color.WHITE); 
     } 

     return vi; 
    } 

    static class ContactsViewHolder { 
     TextView txtTitolo; 
     TextView txtData; 
     TextView txtID; 
     RelativeLayout rel; 
    } 
} 

和单行的XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    android:id="@+id/comCS_RIGA" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:background="#ffffff" 
    android:paddingTop="10dp" 
    android:paddingBottom="10dp" 
    > 

    <TextView 
     android:id="@+id/comCS_Data" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="" 
     android:textColor="#000000" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="16dp" 
     android:textSize="12sp" 
     /> 

    <TextView 
     android:id="@+id/comCS_ID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/comCS_Data" 
     android:visibility="invisible" 
     /> 

    <TextView 
     android:id="@+id/comCS_Titolo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/comCS_Data" 
     android:layout_marginTop="2dp" 
     android:layout_marginLeft="16dp" 
     android:text="" 
     android:textColor="#357cbc" 
     android:textSize="18sp" 
     /> 

    <ImageView 
     android:id="@+id/feedbackCars_Positivo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/frecciacom" 
     android:contentDescription="@string/title_Comunicazioni" 
     android:layout_alignParentRight="true" 
     android:layout_marginTop="2dp" 
     android:layout_marginRight="16dp" 
     /> 

</RelativeLayout> 

回答

2

这是一个常见的错误。 视图被回收,因此您必须在任何情况下设置默认值。

if (read.equals("0")) //DA LEGGERE 
    { 
     //LAYOUT 
     viewHolder.rel = (RelativeLayout)vi.findViewById(R.id.comCS_RIGA); 
     viewHolder.rel.setBackgroundResource(R.drawable.sfondorigacomcs); 
     viewHolder.txtTitolo.setTextColor(Color.WHITE); 
    } 
    else { 
     viewHolder.rel.setBackgroundResource("you_defaulf_bg_res"); 
    } 
+0

感谢很多!有效! :) – Garumbo

1

首先,你没有正确使用ViewHolder模式。 ViewHolder旨在保存对列表项的视图的引用,并将的findViewById(...)调用最小化。

这个目的没有被你的代码满足。 你描述的行为的原因在于视图没有被回收。

做这样的:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View vi = convertView; 
    ContactsViewHolder viewHolder; 

    if(convertView == null) { 

     vi = inflater.inflate(R.layout.comunicazionicslist, null); 
     viewHolder = new ContactsViewHolder(); 

     viewHolder.txtTitolo=(TextView)vi.findViewById(R.id.comCS_Titolo); 
     viewHolder.txtData=(TextView)vi.findViewById(R.id.comCS_Data); 
     viewHolder.txtID=(TextView)vi.findViewById(R.id.comCS_ID); 

     viewHolder.rel = (RelativeLayout)vi.findViewById(R.id.comCS_RIGA); 

     vi.setTag(viewHolder); 

    } else { 
     viewHolder = (ContactsViewHolder) vi.getTag(); 
    } 

    //Settimane 
    viewHolder.txtTitolo.setText(titolo[position].toString()); 

    //Data 
    viewHolder.txtData.setText(data[position].toString()); 

    //ID 
    viewHolder.txtID.setText(id[position].toString()); 

    //Connessianne e Apretura del DB 
    String read = letto[position].toString(); 

    if (read.equals("0")) //DA LEGGERE { 

     viewHolder.rel.setBackgroundResource(R.drawable.sfondorigacomcs); 
     viewHolder.txtTitolo.setTextColor(Color.WHITE); 
    } else { 
     viewHolder.rel.setBackgroundResource(R.drawable.NORMAL_BACKGROUND); 
    } 

    return vi; 
} 
+0

感谢工作,并已帮助我查看持有人! – Garumbo