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

custom listview 사용 시 데이터가 뒤죽박죽되어 나오는 현상..

0 추천
안녕하세요. custom listview 사용 시 데이터가 뒤죽박죽 나옵니다..

만약 데이터가 총 100건 이라면.. 처음 화면에 보여지는 데이터갯수가 15건입니다.

처음 보여지는 15건은 제대로 나오나... 그 뒤에 데이터를 확인하고자 스크롤을 하는 순간부터

데이터가 뒤죽박죽이 됩니다..

데이터 100건은 순서대로 잘 받아오나 화면에서 출력 시 이상하게 나오더라구요..

희한한건

  if (mUser != null) {

   a.setText(mUser.getA());
   b.setText(mUser.getB());
   c.setText(mUser.getC());
   d.setText(mUser.getD());
   e.setText(mUser.getE());

   Log.i("getA",mUser.getA());

  }

이 안에 log를 찍어보면 스크롤 할때마다 이 데이터가 계속 갱신이 되더라구요..

여기서 뭔가 잘못된거 같은데 이유를 모르겠습니다...

소스 첨부합니다...

main.java

[code]

public class Main extends TopMain implements OnClickListener{
 private ListView userList;
 private listViewAdapter adapter;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

  adapter = new listViewAdapter(getApplicationContext());
  userList = (ListView) findViewById(R.id.user_list);
  userList.setAdapter(adapter);

  try {
   connect();
  } catch (JSONException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
       
    }

    private void connect() throws JSONException, IOException  {
     URL url;
  try {
    .
    .
    .
   if(responseCode == HttpURLConnection.HTTP_OK) {
      .
      .
      .
       d_response = new String(byteData);
       JSONArray qq = new JSONArray(d_response);
       JSONObject obj = qq.getJSONObject(0);
       
       try {
        JSONArray arrResults = obj.getJSONArray("result");
        int iCount = arrResults.length();
        
        for( int i = 0; i < iCount; ++i )
        {
         
          JSONObject clsItem = (JSONObject)arrResults.get(i);
         
          String aaa = clsItem.getString("aaa");
       String bbb = clsItem.getString("bbb");
       String ccc = clsItem.getString("ccc");
       String ddd = clsItem.getString("ddd");
       String eee = clsItem.getString("eee");

         // Data 추가
       listView u1 = new listView(aaa, bbb, ccc, ddd, eee);
         adapter.add(u1);
        
         userList.setFocusable(true);
         userList.setSelected(true);
         userList.setSelection(rowNbStart);
        
         //adapter.notifyDataSetChanged();
         
        }

        } catch (JSONException e){
         Log.i("JSON_ERROR.T.T", String.valueOf(e));
        }
       
   }
   
   conn.disconnect();

  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

    }
}

[/code]

 

listViewAdapter.java

[code]

public class listViewAdapter extends BaseAdapter implements OnClickListener {
 private listView mUser;
 private Context mContext;

 private TextView a;
 private TextView b;
 private TextView c;
 private TextView d;
 private TextView e;

 private ArrayList<listView> mUserData;

 public listViewAdapter(Context context) {
  super();
  mContext = context;
  mUserData = new ArrayList<listView>();
 }

 
 @Override
 public int getCount() {
  // TODO Auto-generated method stub
  return mUserData.size();
 }

 @Override
 public listView getItem(int position) {
  // TODO Auto-generated method stub
  return mUserData.get(position);
 }

 @Override
 public long getItemId(int position) {
  // TODO Auto-generated method stub
  return 0;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  // TODO Auto-generated method stub
  View v = convertView;

  if (v == null) {
   v = ((LayoutInflater) mContext
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
     .inflate(R.layout.mainlist, null);

   a = (TextView) v.findViewById(R.id.a);
   b = (TextView) v.findViewById(R.id.b);
   c = (TextView) v.findViewById(R.id.c);
   d = (TextView) v.findViewById(R.id.d);
   e = (TextView) v.findViewById(R.id.e);

  }

  mUser = getItem(position);

  if (mUser != null) {

   a.setText(mUser.getA());
   b.setText(mUser.getB());
   c.setText(mUser.getC());
   d.setText(mUser.getD());
   e.setText(mUser.getE());
   
  }

  return v;
 }

 public void add(listView user) {
  mUserData.add(user);
  
 }
}

[/code]

listview.java는 단순 get,set이라 생략했습니다.
동그랑때앵 (320 포인트) 님이 2016년 3월 21일 질문

2개의 답변

+1 추천
 
채택된 답변

 if (v == null) {
   v = ((LayoutInflater) mContext
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
     .inflate(R.layout.mainlist, null);

   a = (TextView) v.findViewById(R.id.a);
   b = (TextView) v.findViewById(R.id.b);
   c = (TextView) v.findViewById(R.id.c);
   d = (TextView) v.findViewById(R.id.d);
   e = (TextView) v.findViewById(R.id.e);

  }

getView() 부분에서 

 

a = (TextView) v.findViewById(R.id.a);
   b = (TextView) v.findViewById(R.id.b);
   c = (TextView) v.findViewById(R.id.c);
   d = (TextView) v.findViewById(R.id.d);
   e = (TextView) v.findViewById(R.id.e);

이 변수들을 다 if문 바깥으로 빼야 합니다.

findViewById를 한번만 하고싶다면 ViewHolder등의 형태로 구현해서 tag를 get,set해서 사용하셔야 합니다.

ViewHolder는 찾아보시면 예제가 많이 나오니 한번 찾아보세요~

캬옹이 (37,920 포인트) 님이 2016년 3월 21일 답변
동그랑때앵님이 2016년 3월 31일 채택됨
답변을 이제 봐서 죄송합니다...
처음 설정 변수들 if문 바깥으로 빼는걸로 잘 해결됐습니다...
감사합니당..
0 추천
뷰홀더 패턴 적용하세요
익명사용자 님이 2016년 3월 21일 답변
...