У меня странное поведение при рендеринге элементов в Listview. Я постараюсь объяснить как можно лучше:
Я создал CustomView для использования в качестве элементов в ListView.
Этот CustomView имеет Framelayout в качестве корневого представления и 2 дочерних:
1) LinearLayout с кучей TextView как потомков
2) и сверху (последний, который будет добавлен к структуре кадра) вид с фоном
Селектор, который меняет цвет, когда я нажимаю его. (Просто чтобы визуально намекнуть пользователю, что я выбрал элемент ...
Теперь проблема ... так как текстовые представления могут изменять свою высоту, потому что они многострочные, мне нужно соответствующим образом изменить высоту вида сверху ...
А поскольку вид сверху и linearLayout находятся на одном уровне в Framelayout, я не могу сделать это в XML-файле.
Итак, я расширил FrameLayout, накачал xml-файл пользовательского представления и переопределил onLayout (...). Делая это, я могу получить высоту LinearLayout и передать ее на вид сверху:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b){
super.onLayout(changed, l, t, r, b);
LinearLayout ll = (LinearLayout) findViewById(R.id.linear_layout_items);
int height = ll.getMeasuredHeight();
//Setting the height in the View...
View view = findViewById(R.id.click_view);
view.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
}
Теперь это работает безупречно, за исключением некоторых случаев ...
Если экран способен отображать первые 4 элемента, и я прокручиваю до 5-го элемента, высота вида сверху (с идентификатором R.id.click_view) в параметре 0 устанавливается, хотя она была установлена правильно. ... И если я начну прокручивать, это начнет происходить случайно ...
Я проверил это на планшете под управлением Android 3.1 и в эмуляторе под управлением ICS, и он отлично работает ... Сбой только на устройствах с версиями <= 2.x… </p>
Любой совет, как исправить это поведение?
Заранее спасибо за любую помощь или советы.
Это полный код:
Активность
public class DemoCursorActivity extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init()
{
MatrixCursor cursor = new MatrixCursor(new String[]{ "_id", "txt1", "txt2", "txt3","txt4" });
cursor.addRow(new Object[]{ 1, "1111111111","1111111111","1111111111","1111111111" });
cursor.addRow(new Object[]{ 2, "2222222222","2222222222","2222222222","2222222222" });
cursor.addRow(new Object[]{ 3, "3333333333","3333333333","3333333333","3333333333" });
cursor.addRow(new Object[]{ 4, "4444444444","4444444444","4444444444","4444444444" });
cursor.addRow(new Object[]{ 5, "5555555555","5555555555","5555555555","5555555555" });
cursor.addRow(new Object[]{ 6, "6666666666","6666666666","6666666666","6666666666" });
cursor.addRow(new Object[]{ 7, "7777777777","7777777777","7777777777","7777777777" });
cursor.addRow(new Object[]{ 8, "8888888888","8888888888","8888888888","8888888888" });
ItemsCursorAdapter cursorAdapter = new ItemsCursorAdapter (this, cursor);
setListAdapter(cursorAdapter);
}
class ItemsCursorAdapter extends CursorAdapter
{
private final LayoutInflater mInflater;
public ItemsCursorAdapter(Context context, Cursor cursor) {
super(context, cursor);
mInflater = LayoutInflater.from(context);
}
@Override
public void bindView(View v, Context context, Cursor cursor)
{
Resources res = context.getResources();
TextView tv1 = (TextView) v.findViewById(R.id.text1);
TextView tv2 = (TextView) v.findViewById(R.id.text2);
TextView tv3 = (TextView) v.findViewById(R.id.text3);
TextView tv4 = (TextView) v.findViewById(R.id.text4);
tv1.setText(cursor.getString(1));
tv2.setText(cursor.getString(2));
tv3.setText(cursor.getString(3));
tv4.setText(cursor.getString(4));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
View v = new ListItemWidget(context);
bindView(v, context, cursor);
return v;
}
}
Файл макета элемента:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFF" >
<LinearLayout
android:id="@+id/linear_layout_items"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="false"
android:textColor="#000"
android:textSize="20sp" />
<TextView
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="false"
android:textColor="#000"
android:textSize="20sp" />
<TextView
android:id="@+id/text3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="false"
android:textColor="#000"
android:textSize="20sp" />
<TextView
android:id="@+id/text4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="false"
android:textColor="#000"
android:textSize="20sp" />
</LinearLayout>
<View
android:id="@+id/click_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/group_item_backgroud_selector" />
</FrameLayout>
и мой пользовательский вид:
public class ListItemWidget extends FrameLayout
{
public ListItemWidget(Context context) {
super(context);
inflate(context, R.layout.list_item, this);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b)
{
super.onLayout(changed, l, t, r, b);
LinearLayout ll = (LinearLayout) findViewById(R.id.LinearLayout01);
int height = ll.getMeasuredHeight();
View view = findViewById(R.id.click_view);
view.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
}
}