Dev.
ListView [1. Parser로 받아오고 거기에 Expand를 간단히 추가하는법입니다.] 본문
메일로 추가질문이 와서 작성합니다. 리스트뷰 클릭시, 즉 리스트뷰에 대한 터치이벤트로 어떠한 페이지를주고 그페이지에 리스트뷰의 정보를 가지고오고 싶다는 질문이었는데요. 제가 오늘 시험날이라 시간이 30분정도뿐이 없어서 최대한 간단한 방법으로 설명드리고 2~3개 방법이있긴한데 제일무난한 방법으로 포스팅하겠습니다. |
일단 제가 진행중인 프로젝트로 설명을 드릴거구요, 실험실 프로젝트중하나라.. 전체소스는 공개하지못하고, 코딩에 지장이없을정도의 부분만 공개해드리겠습니다. 그냥 아,이런방법도 있구나 하는생각으로 봐주심 감사하겠습니다.ㅎ 일단 저는 리스트뷰의 아이템에 34.58194//127.286009//1220000001//19//13//11.86//15.5//28.9 이런 값들을 아이템마다 각각 다르게 띄웁니다. 이런 XML을 받아와서 // 기준으로 문자열을 자르고, 제가원하는 정보를 취하는데요. 일단 중요한건 이게아니고... 이아래가 제가 전에 포스팅했던 XML 파싱부분의 소스(물론 좀틀리겠죠, 제가 따로 계속코딩하던부분을 보여드리는거니.ㅎ) 입니다 |
private void readServerOne(){ Thread thread = new Thread(new Runnable() {
@Override public void run() { // TODO Auto-generated method stub try {
String url = "http://220.149.36.41:8080/Electron/LatLngParse/LatLngParse.jsp";
HttpGet get = new HttpGet(url);
HttpResponse responseGET = new DefaultHttpClient().execute(get);
HttpEntity resEntity = responseGET.getEntity();
if(resEntity != null){ String resString = EntityUtils.toString(resEntity,"UTF-8"); Message message = handler.obtainMessage(); message.obj = resString; handler.sendMessage(message); }
} catch (ClientProtocolException e) { // TODO: handle exception } catch (ParseException e){
} catch (IOException e){
}
} });
progressDialog = ProgressDialog.show(List.this, "기다리세요", "Downloading.."); thread.start(); }
private Handler handler = new Handler(){
@Override public void handleMessage(Message msg){ progressDialog.dismiss(); readXML((String)msg.obj); }
};
private void readXML(String xml){ try{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); //String info[] = null; InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8")); Document document = builder.parse(is); Element order = (Element)document.getDocumentElement();
//TextView textView1 = (TextView)findViewById(R.id.textView1); //textView1.append("--------루트 엘리먼트 :: "+order.getTagName() + "\n\n");
NodeList nodelist = order.getElementsByTagName("item"); list = new ArrayList<String>();
int i=0; while(i < nodelist.getLength()){
Node node = nodelist.item(i); Node text = node.getFirstChild(); LatLng = text.getNodeValue(); saveLists = LatLng.split("//"); Lat = Double.parseDouble(saveLists[0]); Lng = Double.parseDouble(saveLists[1]); id = Integer.parseInt(saveLists[2]); gyrox = saveLists[3]; gyroy = saveLists[4]; v = Double.parseDouble(saveLists[5]); ondo = Double.parseDouble(saveLists[6]); supdo = Double.parseDouble(saveLists[7]); if(id>=1020000001 && id<=1020999999){ list.add(i+"번"+"--대분류::국가기준점--소분류::삼각점"+'\n'+'\n'+"기준점ID::"+id+'\n'+'\n'+"Info:"+Lat+":"+Lng+":"+gyrox+":"+gyroy+':'+v+":"+ondo+":"+supdo+":"+'\n'+"----------------");} if(id>=1021000001 && id<=1021999999){ list.add(i+"번"+"--대분류::국가기준점--소분류::수준점"+'\n'+'\n'+"기준점ID::"+id+'\n'+'\n'+"Info:"+Lat+":"+Lng+":"+gyrox+":"+v+":"+ondo+":"+supdo+":"+'\n'+"----------------");} if(id>=1022000001 && id<=1022999999){ list.add(i+"번"+"--대분류::국가기준점--소분류::통합기준점"+'\n'+'\n'+"기준점ID::"+id+'\n'+'\n'+"Info:"+Lat+":"+Lng+":"+gyrox+":"+v+":"+ondo+":"+supdo+":"+'\n'+"----------------");} i++;
} adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
setListAdapter(adapter);
}catch (UnsupportedEncodingException e){
}catch (ParserConfigurationException e){
}catch (SAXException e){
}catch (IOException e){
} } |
그리고 저희는 이 파서로 받와서 추가시킨 리스트아이템에 대한 클릭이벤트를 주는게 목적이죠? 저소스 바로 아랫부분에 이어지는 소스라 생각하시면되고, 메서드명은 onListItemClick(); 입니다(바로 아래소스입니다) |
protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); int chk; String desc; if(position>=0){
chk=l.getPositionForView(v); desc=list.get(chk); Bundle extras = new Bundle(); extras.putInt("a",chk); extras.putString("b",desc); Intent intent = new Intent(this, Test.class); intent.putExtras(extras); startActivity(intent);} } |
보시면 아이템이 클릭됬을떄, 포지션이 0이상인지 검사합니다. 뭐 아이템의 포지션은 무조건 0이상이지만, 혹시모를 에러를 피하고자 선언한부분입니다. 이프문으로 들어가면, chk라는 변수에 현재 눌려진 아이템의 포지션을 저장합니다. 검사법은 위에도있지만 ListView.getPositionForView(View view); 로 획득 하시면됩니다. 그 바로아래 adapter.get(position) 메서드로 해당 포지션에 대한 정보를 desc안에 저장합니다. 그리고 Bundle은 데이터를 한번에 모아서 인텐트로 넘기기위해서 선언한부분이고 그바로아래보시면 Bundle 안에 포지션값과, 그포지션에 대한 정보를 집어넣는걸 볼수있을겁니다. 그리고 마무리로 정보를 표현할 하나의 액티비티로 보냅니다. 이제 Test액티비티에서 간단한 조작으로 해당정보를 받을수 있게됩니다. |
public class Test extends Activity { public class extends Activity { //String recieved; String[] infoAll,infoOne,infoTwo,infoThree; String one,two,three; String index,aOne,bOne; String id; String vi,code,lat,lng,gyrox,gyroy,ondo,supdo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.item_click_example_next_activity); String b = getIntent().getStringExtra("b"); // 이부분이 번들값을 받는 부분입니다. //번들값을 받아, b라는 변수에 저장하고 있죠. Button goMap = (Button)findViewById(R.id.goMap); TextView indexT = (TextView)findViewById(R.id.index); TextView aOneT = (TextView)findViewById(R.id.aOne); TextView bOneT = (TextView)findViewById(R.id.bOne); TextView idT = (TextView)findViewById(R.id.code); TextView latT = (TextView)findViewById(R.id.lat); TextView lngT = (TextView)findViewById(R.id.lng); TextView gyroxT = (TextView)findViewById(R.id.gyro); TextView gyroyT = (TextView)findViewById(R.id.gyro2); TextView ondoT = (TextView)findViewById(R.id.ondo); TextView supdoT = (TextView)findViewById(R.id.supdo); TextView vT = (TextView)findViewById(R.id.v);
infoAll=b.split("\n\n");
one = infoAll[0]; two = infoAll[1]; three = infoAll[2];
infoOne=one.split("--|::");
index = infoOne[0]; aOne = infoOne[2]; bOne = infoOne[4];
infoTwo=two.split("::");
id = infoTwo[1];
infoThree=three.split(":"); lat = infoThree[1]; lng = infoThree[2]; gyrox = infoThree[3]; gyroy = infoThree[4]; vi = infoThree[5]; ondo = infoThree[6]; supdo = infoThree[7];
indexT.setText(index); aOneT.setText(aOne); bOneT.setText(bOne); idT.setText(id); latT.setText(lat); lngT.setText(lng); gyroxT.setText(gyrox); gyroyT.setText(gyroy); ondoT.setText(ondo); supdoT.setText(supdo); vT.setText(vi);
} |
위와같은 코드로 해당페이지에 인텐트로 넘어온값을 집어넣을수 있습니다. 위 소스는 어디까지나 제가 진행중인 프로젝트의 일부분이므로 이해가 좀 어려우실수 있을겁니다. 코드만 보시는거보다 아래 결과화면 보시는게 훨씬 이해가 빠르실거에요. |
|
이런식으로 위에서 리스트 아이템을 누르면 거기에대한 값과 포지션을 하나의 번들에 담고 인텐트로 넘긴뒤, 넘겨진 페이지에서 값,포지션을 받아 재분해하여 해당텍스트뷰에 반영하는 식으로 진행된 코드입니다. 참고로 리스트뷰 의 리스트아이템에 해당되는정보, 즉 이걸 예로들어 첫번쨰 아이템이라고 가정한다면, 0번--대분류::국가~~~~~~~~info:34...........5: 이 문장을 하나의 스트링으로 취급하여 보낸다는 말입니다, 그래서 번들값을 넘겨받은 액티비티에서 split를 한번더 사용한거구요^^ 도움이 되셨길 바라고, 궁금한거 있으시면 또 메일부탁드립니다.ㅎ |
'Android' 카테고리의 다른 글
Android SQL Parser [1. DomParser ] (3) | 2014.02.15 |
---|---|
GoogleMap API V2 [4.구글맵에 마커 설정하기! (2) ] (3) | 2014.02.15 |
GoogleMap API V2 [3.구글맵에 마커 설정하기! (1) ] (2) | 2014.02.15 |
GoogleMap API V2 [2.구글맵에 카메라 설정하기! ] (4) | 2014.02.15 |
GoogleMap API V2 [1. 맵을 띄워보자!] (2) | 2013.06.05 |