Программное изменение LayoutParams в CustomView для ListActivity не влияет на некоторые элементы - PullRequest
2 голосов
/ 06 января 2012

У меня странное поведение при рендеринге элементов в 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));
    }
}
...