마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

baseadapter, customlistview 에서 마지막 값 하나만 출력됩니다.

0 추천

안녕하세요. 

일단 저는 기본이 부족해서 제가 해놓고 뭐가 잘 못 됐는지를 잘 모르는 편입니다.

그 때 그 때 구글링해서 해보는 쪽입니다. 그래서 걱정되는게 코드가 많이 안 좋을꺼고 보시기도 힘들지도

모릅니다. 넓은 아량으로 양해해주세요. 죄송합니다.

 

우선 문제는 open api에서 값을 가져왔는데

그냥 Arraylist<String>으로 값을 가져와서 ArrayAdapter에 집어넣으면 값 전체가 일반적인 그냥

리스트뷰에 제대로 들어가는것 까지는 확인이 됩니다.

 

그런데 값을 여러개 가져와야되서 baseadpater를 썻는데, 마지막 값만 커스텀 리스트 뷰에 하나만

출력이 되는데 왜 그렇게 되는지 모르겠습니다....

 

소스를 첨부하겠습니다.

 

 

protected void onPostExecute(String result){




            try {
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                factory.setNamespaceAware(true);
                XmlPullParser xpp = factory.newPullParser();

                xpp.setInput(new StringReader(result));
                int eventType = xpp.getEventType();
                boolean bSet = false;
                while (eventType != XmlPullParser.END_DOCUMENT){
                    if(eventType == XmlPullParser.START_DOCUMENT){
                        ;
                    } else if(eventType == XmlPullParser.START_TAG){
                        tag_name = xpp.getName();
                        if(tag_name.equals("age"))

                            bSet = true;

                    } else if(eventType == XmlPullParser.TEXT){
                        if(bSet){
                           // String content = xpp.getText();
                           // data.append(content + "\n");
                            bSet = false;
                        }

                        if(tag_name.equals("filename")){
                            Aimage = xpp.getText();   ------>파일이름을 가져오는 놈입니다. String Aimage;로 되있습니다.
                            //data.append(Aimage);
                            
                        }

                        if(tag_name.equals("age")){

                            Aage = xpp.getText();     ------->나이를 가져오는 놈으로 String Aage; 로 되있습니다.
                            item.add(Aage);
                        }

                        if(tag_name.equals("happenPlace")){
                            Ajuso = xpp.getText();   --------> 주소를 가져오는 놈으로 String Ajuso;으로 되있습니다.

                          
                        }

                       

                       testAnimals = new ArrayList<TestAnimal>();

                       datal = new TestAnimal(Aage,Ajuso,Aimage);

                       testAnimals.add(datal);
                       animal_adapter = new Custom_CatList_Adapter(getApplicationContext(),testAnimals);

                        look_cat.setAdapter(animal_adapter);
                        animal_adapter.notifyDataSetChanged();

                       
                    } else if(eventType == XmlPullParser.END_TAG){
                        ;
                    }
                    eventType = xpp.next();



                }
            } catch (Exception e){

               

            }


        }

그 다음에 

baseadaptaer부분입니다.

public class Custom_CatList_Adapter extends BaseAdapter{

    ArrayList<TestAnimal> testAnimals;
    Context context;
    LayoutInflater inflater;

    public Custom_CatList_Adapter(Context context, ArrayList<TestAnimal> testAnimals){
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context = context;
        this.testAnimals = testAnimals;


    }


    public int getCount(){
        return testAnimals.size();
    }

    public Object getItem(int position){
        return testAnimals.get(position);
    }

    public long getItemId(int position){
        return position;
    }


    public View getView(int position, View convertView, ViewGroup parent){
        View v = convertView;
        if(v == null){
           // v = inflater.inflate(R.layout.cat_custom, parent, false);
            inflater = LayoutInflater.from(parent.getContext());
            v = inflater.inflate(R.layout.cat_custom, parent, false);
        }
        //}

       TestAnimal testAnimal = testAnimals.get(position);
            TextView imageView = (TextView)v.findViewById(R.id.imageView);
            TextView find_jang_so = (TextView)v.findViewById(R.id.find_jang_so);
            TextView find_age = (TextView)v.findViewById(R.id.find_age);

            imageView.setText(testAnimal.getAimage());
            find_jang_so.setText(testAnimal.getAjuso());
            find_age.setText(testAnimal.getAage());

       // TextView imageView = (TextView)v.findViewById(R.id.imageView);
      //  imageView.setText(testAnimals.get(position).getAimage());

       // TextView find_jang_so = (TextView)v.findViewById(R.id.find_jang_so);
       // find_jang_so.setText(testAnimals.get(position).getAjuso());

       // TextView find_age = (TextView)v.findViewById(R.id.find_age);
       // find_age.setText(testAnimals.get(position).getAage());

        notifyDataSetChanged();



        return v;
    }
}


class TestAnimal {

    String Aimage, Aage, Ajuso;

    public TestAnimal(String Aimage, String Aage, String Ajuso){
        this.setAimage(Aimage);
        this.setAage(Aage);
        this.setAjuso(Ajuso);
    }

    public String getAimage(){
        return Aimage;
    }

    public void setAimage(String aimage){
        Aimage = aimage;
    }

    public String getAage(){
        return Aage;
    }

    public void setAage(String age){
        Aage = age;
    }

    public String getAjuso(){
        return Ajuso;
    }

    public void setAjuso(String ajuso){
        Ajuso = ajuso;
    }
}

여기만 보고도 잘 못된게 있는건지 조언좀 해주세요. 부탁드립니다.

감사합니다.

소다소 (290 포인트) 님이 2016년 3월 7일 질문

2개의 답변

+1 추천
 
채택된 답변
보니까 문제가 좀있네요~

일단 데이터 파싱되는건 잘되는지 안되는지 제가 알수없는 부분이고,

파싱할때 while문 돌면서 adapter를 계속 새로 생성하고 있어서 제일 마지막으로 while문을 돌고남은 마지막 데이터하나만 리스트에 보이게 되는것입니다.

일단 while문 바깥에 arrayList를 생성해서 하나의데이터 파싱이 끝나면 add를 해서 데이터를 쌓아주시고

파싱전체가 끝난후에 adapter를 생성해야 합니다.
 
간단하게 말하면 while문에 있는 리스트 세팅하는 부분들을 while 바깥으로 옮기시면 간단하게 해결 가능할것 같구요,

testAnimals = new ArrayList<TestAnimal>(); 이것은 최초 한번만 while 하기전에 하셔야합니다 while에서 계속 초기화하시면 데이터가 쌓이지가 않습니다.

그리고 Adapter에 getView에서는 notifyDataSetChanged를 할필요가 없습니다.
캬옹이 (37,920 포인트) 님이 2016년 3월 8일 답변
소다소님이 2016년 3월 8일 채택됨
정말 감사합니다. 한줄기 빛이에요!  행복하세용
+1 추천
파싱부분이 잘못되었습니다

xml을 중첩이 아닌 구조로 바꾸시던가

Json으로 하시던가

아니면 age를 구하는 if문 내부에서 새로 xml풀파서를 새로 만들어서 파싱해야 합니다.

xml파서 구조상 그렇게 하는 방법밖엔 없더군요.
익명사용자 님이 2016년 3월 8일 답변
소중한 답변 감사합니다!
...