2015-09-18 5 views
0

У меня есть ShapeDrawable Drawable/my_shape.xmlAltered GradientDrawable получает unwantedly повторно в разных местах

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid 
     android:color="#FFFF00" /> 
    <padding android:left="1dp" 
     android:top="1dp" 
     android:right="1dp" 
     android:bottom="1dp" /> 
</shape> 

, который я использую в качестве фона некоторых TextView с в нескольких местах в моем приложении. Как и в макет/my_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout...> 
    <TextView 
     android:id="@+id/tag" 
     android:background="@drawable/my_drawable" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap" 
     android:text="Some text" 
    /> 
<!-- other tags --> 
</RelativeLayout> 

или в макете, который получает используется в качестве элемента списка макета/my_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout...> 
    <TextView 
     android:id="@+id/subject" 
     android:background="@drawable/my_drawable" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap" 
    /> 
<!-- other tags --> 
</RelativeLayout> 

Теперь, когда я изменить цвет формы программно внутри моего ArrayAdapter моего списка, фон TextView внутри фрагмента на совершенно другом месте в моем приложении получает тот же цвет, что и последний элемент в моем списке! С этого момента форма с измененным цветом используется во всех других действиях, в которых my_fragment.xml используется в макете.

holder.subject = (TextView) v.findViewById(R.id.subject); 

GradientDrawable bgShape = (GradientDrawable)holder.subject.getBackground(); 
bgShape.setColor(position % 2 == 0 ? Color.BLACK : Color.WHITE); 

Как это возможно, и как я могу избежать этого «повторного» поведение?

Вот код моего адаптера массива:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    ViewHolder holder; // to reference the child views for later actions 

    if (v == null) { 
     LayoutInflater vi = 
      (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.my_list_item, null); 
     // cache view fields into the holder 
     holder = new ViewHolder(); 
     holder.subject = (TextView) v.findViewById(R.id.subject); 
     // associate the holder with the view for later lookup 
     v.setTag(holder); 
    } 
    else { 
     // view already exists, get the holder instance from the view 
     holder = (ViewHolder) v.getTag(); 
    } 

    GradientDrawable bgShape = (GradientDrawable)holder.subject.getBackground(); 
    bgShape.setColor(position % 2 == 0 ? Color.BLACK : Color.WHITE); 
    holder.subject.setText(getItem(position)); 
} 

// somewhere else in your class definition 
static class ViewHolder { 
    TextView subject; 
} 
+0

У меня создалось впечатление, что 'mutate' может решить мою проблему http://stackoverflow.com/questions/7979440/android-cloning-a-drawable-in-order-to-make-a-statelistdrawable-with-filters – OneWorld

ответ