Android2014. 4. 6. 13:18

ListView 2개를 ScrollView로 감싸서 ListView2개가 ScrollView 높이를 초과하게 되면 스크롤 되어 보여지게 UI를 구성했습니다.

문제는 ListView 2개의 heigh를 wrap_content나 match_parent를 주고 ScrollView로 감싸게 되면 ScrollView에서는 ListView의 height를 제대로 인식하지 못해서 ScorllView안의 ListView들이 제대로된 height 만큼 표시되지 않고 잘려서 표시되게 됩니다.

그렇다고 ListView에 heigh를 고정 크기로 지정해주게 되면 정작 ListView의 아이템 개수에 맞게 ListViewt를 표시 할수 없는 문제가 생깁니다.

그래서 ListView를 제대로 표시할 수 있는 방법을 찾아보니 ListView의 초기화 및 Item(data)을 갱신한후 ListView의 height를 계산하여 ListView에 LayoutParams을 설정하는 방법이 있더군요 이방법을 적용해보니 ListView가 제대로 표시되고 스크롤도 가능하게 됩니다.

소스코드를 공유 하자면

protected void onCreate(Bundle savedInstanceState) {
        ListView listview1 = (ListView) view.findViewById(R.id.list1);
        ArrayAdapter<Data> adapter = new ArrayAdapter<Data>(this, R.layout.simple_list_item, listData1);
        listview1.setAdapter(adapter);

        ListView listview2 = (ListView) view.findViewById(R.id.list2);
        adapter = new ArrayAdapter<Data>(this, R.layout.simple_list_item, listData2);
        listview2.setAdapter(adapter);

        setListViewHeightBasedOnChildren(listview1);
        setListViewHeightBasedOnChildren(listview2);
}

public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter(); 
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
}

리스트 뷰가 갱신될때 setListViewHeightBasedOnChildren() 호출을 하게 되면 ListView를 ScrollView로 감싸게 UI를 구성하더라도 ListView 정상적으로 표시되고 스크롤이 되게 됩니다.

 

Posted by 위푸
Android2013. 6. 13. 20:34

Drawable에 Image(bitmap)를 가져와서 지정해주고 colorFilter를 지정해 주면 bitmap에 ColorFilter가 적용된 Drawable을 이용하여 view에 배경을 지정해 줄 수 있습니다.

보통의 경우

BitmapDrawable bd = new BitmapDrawable(bitmap);
view.setBackgroundDrawable(bd );


위와 같이 적용하면 되는데
아래와 같이 stateDrawable을 사용하여 배경을 지정해 주게 되면 ColorFilter가 적용되지 않은 원본 bitmap 배경이 지정되는 문제가 생깁니다.

BitmapDrawable bd = new BitmapDrawable(bitmap);
StateListDrawable stateDrawable = new StateListDrawable();
stateDrawable.addState(new int[]{-android.R.attr.state_pressed}, bd);
view.setBackgroundDrawable(stateDrawable); 

그러하여 위와 같은 문제를 해결하기 위해서

Bitmap orgBitmap = getResources().getDrawable(id);
paint = new Paint();
Bitmap copyBitmap = Bitmap.createBitmap(orgBitmap.getWidth(), orgBitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(copyBitmap);
canvas.drawBitmap(orgBitmap, 0, 0, paint);
BitmapDrawable bd = new BitmapDrawable(copyBitmap);
StateListDrawable stateDrawable = new StateListDrawable();
stateDrawable.addState(new int[]{-android.R.attr.state_pressed}, bd);
view.setBackgroundDrawable(stateDrawable);

위와 같이 ColorFilter를 적용하여 새로 만든 Bitmap에 그리고 StateListDrawable에 새로 만든 bitmap을 지정한 Drawable을 적용하게 되면 StateListDrawable을 사용하게 되도 ColorFilter가 적용된 배경이 보여지게 됩니다.

 

 

Posted by 위푸