KnP House for Daily

[Tizen Native App] ListView CreateItem 관련.. 본문

Tizen/Tizen project

[Tizen Native App] ListView CreateItem 관련..

K.ung 2014.06.08 11:37

Tizen Native App 에서 


ListView를 이용하여 정류장 정보를 뿌려주는 작업을 진행 하던 중 겁나게 에러 찾기 힘들었던 부분에 대해...


막상 지금 해결하고 보니 정말 엄청나게 단순한거 였다..




일단 ListView에서 각각의 아이템을 설정하는 작업은


  ListItemBase*
LisviewTestForm::CreateItem(int index, float itemWidth)
{
 CustomItem* pItem = new (std::nothrow) CustomItem();
/*
 여기다가 어쩌고 저쩌고
*/
}

위처럼 진행된다.


이게 총 사이즈 만큼 호출 반복되어 리스트를 구성시켜주는데.


developer에 ListView 기본 예제를 보면 


switch (index % 4)
    {
    case 0:
        {
            style = LIST_ANNEX_STYLE_NORMAL;
            pItem->Construct(Dimension(itemWidth,112), style);
            pItem->AddElement(Rectangle(10, 20, 60, 60), ID_FORMAT_BITMAP, *__pHome, null, null);
            pItem->AddElement(Rectangle(80, 25, 150, 50), ID_FORMAT_STRING, L"Home", true);
        }
        break;
    case 1:
        {
            style = LIST_ANNEX_STYLE_DETAILED;
            pItem->Construct(Dimension(itemWidth,112), style);
            pItem->AddElement(Rectangle(10, 20, 60, 60), ID_FORMAT_BITMAP, *__pMsg, null, null);
            pItem->AddElement(Rectangle(80, 25, 150, 50), ID_FORMAT_STRING, L"Msg", true);
        }
        break;
    case 2:
        {
            style = LIST_ANNEX_STYLE_ONOFF_SLIDING;
            pItem->Construct(Dimension(itemWidth,112), style);
            pItem->AddElement(Rectangle(10, 20, 60, 60), ID_FORMAT_BITMAP, *__pAlarm, null, null);
            pItem->AddElement(Rectangle(80, 25, 150, 50), ID_FORMAT_STRING, L"Alarm", true);
        }
        break;
    case 3:
        {
            style = LIST_ANNEX_STYLE_MARK;
            pItem->Construct(Dimension(itemWidth,112), style);
            pItem->AddElement(Rectangle(10, 20, 60, 60), ID_FORMAT_BITMAP, *__pCall, null, null);
            pItem->AddElement(Rectangle(80, 25, 150, 50), ID_FORMAT_STRING, L"Call", true);
        }
        break;
    default:
        break;
    }


위처럼 switch 문을 돌려가며,  각 각의 아이템을 지정해준다.


한셀에 들어갈 아이템은 


Tizen::Graphics::FloatRectangle class를 이용하여 각 위치와 영역을 지정해서 위치 시켜주고,(이작업이 너무 불편하다....일일이 수작업...)


string 형이나, 비트맵형식등 원하는 것을 삽입 시킬 수 있다.


하지만!!!! 난 저걸 내 입맞에 맞게  IF/ELSE문으로 바꾸어 했더니. 두둥 


Sysassert 라는 에러를 뱉어내며 뻗어 버렸다. 


처음엔 index 참조 문제 인가 싶었지만, 그것도 아니였다.  이래저래 많은 고민과 테스트 끝에


AddElement() 파라미터 값중에 elementId 가 있는데... 이게 문제였다.


elementId가 각각의 아이템마다 서로 다 다르게 하니깐 굉장희 원하는 대로 되더라.!!!! /......


근데 이게 그렇게 되면 비효율적인 elementId의 낭비를 불러일으키지만 일단 임시방편책으로다가..........





P.S. 


FloatRectangle 은 여러 Construct 가 있지만 나는 (x,y width , height) 를 사용하여 배치 시켰다.


그리고 FloatDimension을 이용하여 한 셀의 크기를 지정하여 주었다.



ListItemBase*
LisviewTestForm::CreateItem(int index, float itemWidth)
{
	AppLog("LisviewTestForm::CreateItem index=%d",index);
	ListAnnexStyle style = LIST_ANNEX_STYLE_NORMAL;
	pItem = new (std::nothrow) CustomItem();

	FloatRectangle firstElementRect(26.0f, 10.0f, 100.0f, 80.0f);//(10, 20, 60, 60);
	FloatRectangle secondElementRect(150.0f, 10.0f, 300.0f, 60.0f);//(80, 25, 150, 50);
	FloatRectangle thirdElementRect(150.0f, 77.0f, 370.0f, 60.0f);//(80, 25, 150, 50);

	FloatDimension itemDimension(itemWidth,150.0f);

	AppLog("index = %d",index);

	_pGwangyukList->GetAt(index, _pGwanyukBusInform);

	int _index=0;
	Tizen::Base::Integer::Parse(*(_pGwanyukBusInform->Get_routeType()), _index);

	String busInform1 = "[" + *(_pGwanyukBusInform->Get_rtNm()) + "]";
	String busInform2 = "[" + *(_pGwanyukBusInform->Get_arrmsg1()) + "]";

	if(_index == GISUNBUS_NUM){
		pItem->Construct(CoordinateSystem::AlignToDevice(itemDimension), style);
		pItem->AddElement(firstElementRect, ID_FORMAT_BITMAP1, *__pGisunBus,null,null);
		pItem->AddElement(secondElementRect, ID_FORMAT_STRING1, busInform1, false);
		pItem->AddElement(thirdElementRect, ID_FORMAT_STRING2, busInform2, false);
	}else if(_index == GANSUNBUS_NUM){
		pItem->Construct(CoordinateSystem::AlignToDevice(itemDimension), style);
		pItem->AddElement(firstElementRect, ID_FORMAT_BITMAP2,  *__pGansunBus,null,null);
		pItem->AddElement(secondElementRect, ID_FORMAT_STRING1, busInform1,false);
		pItem->AddElement(thirdElementRect, ID_FORMAT_STRING4, busInform2, false);
	}else if(_index == GWANYUKBUS_NUM1 || _index == GWANYUKBUS_NUM2){
		pItem->Construct(CoordinateSystem::AlignToDevice(itemDimension), style);
		pItem->AddElement(firstElementRect, ID_FORMAT_BITMAP3, *__pGwanyukBus,null,null);
		pItem->AddElement(secondElementRect, ID_FORMAT_STRING1, busInform1,false);
		pItem->AddElement(thirdElementRect, ID_FORMAT_STRING6, busInform2, false);
	}else{
		pItem->Construct(CoordinateSystem::AlignToDevice(itemDimension), style);
		pItem->AddElement(firstElementRect, ID_FORMAT_BITMAP4, *__pGwanyukBus,null,null);
		pItem->AddElement(secondElementRect, ID_FORMAT_STRING1, busInform1,false);
		pItem->AddElement(thirdElementRect, ID_FORMAT_STRING8, busInform2, false);
	}

	return pItem;
}
저작자 표시 비영리 변경 금지
신고
0 Comments
댓글쓰기 폼