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

동적으로 늘어나는 리스트뷰 질문 입니다

0 추천

동적으로 스크롤을 하여 맨 마지막 항목에가면 새로 목록 추가가 되는 리스트뷰를 만들고 있습니다.

리스트뷰를 만들었는데. 동적으로 로딩도 됩니다. 

그런데 문제는

동적으로 로딩되어 나오는 데이터가 로딩되었을때

1.나온 페이지가 다시 반복되서 나옵니다. (새로 로딩되는 Item 정보가 처음 로딩되었던 리스트뷰 목록의 마지막 아이템이 반복적으로 나타납니다.)

2.itemCount를 찍어본 결과 개수도 2배가 되구요.(20개씩 호출함. 현재는 20개를 호출했는데 리스트상에 40개가 늘어남)

==> 스크롤 끝에 갔을때 20개 씩 제대로 나타나게 하려면 어떻게 해야할까요?

어댑터가 문제인건지 Getter Setter 부분이 문제인건지 저혼자는 알수가 없네요..ㅠㅠ

오늘 하루종일 구글링하며 고처보았지만 성과가 없어.. 

염치불구 하고 질문 드립니다.

//앱이 시작되면되면서 호출 서버에 Json 정보 호출

 

HashMap<String, String> data = new HashMap<String, String>();

data.put("pageIdx""1");

data.put("orderBy", orderByStr);

Log.d("orderByStr", orderByStr);

  Log.d("pageIdxStr", pageIdxStr);

data.put("userId", getIntent().getStringExtra("userIdInt"));

AsyncHttpPost asyncHttpPost = new AsyncHttpPost(data);

asyncHttpPost.execute("http://URL");

 

 

익명사용자 님이 2013년 4월 22일 질문
그리고 리스트뷰를 동적로딩하는 부분 입니다.

 listView.setOnScrollListener(new OnScrollListener() {
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
            //Check if the last view is visible
            int count = totalItemCount - firstVisibleItem;
            
            if(2 >= count && totalItemCount != 0)
            {   
          int pageIdxInt = Integer.parseInt(pageIdxStr);
         int pageCount = pageIdxInt + 1;
         System.out.println(pageCount);
         if (pageCount == 2) {
         String pageCounsStr = Integer.toString(pageCounts);
           HashMap<String, String> data = new HashMap<String, String>();
        data.put("pageIdx", "2");
        data.put("orderBy", orderByStr);
        Log.d("orderByStr", orderByStr);
          Log.d("pageIdxStr", pageCounsStr);
        data.put("userId", getIntent().getStringExtra("userIdInt"));
        AsyncHttpPostS asyncHttpPost = new AsyncHttpPostS(data);
        asyncHttpPost.execute("http://URL");
}
그리고 Aync를 구성하는 Class입니다. AsyncHttpPost와 AsyncHttpPostS는 같은 내용입니다.
public class AsyncHttpPost extends AsyncTask<String, String, String> {
    private HashMap<String, String> mData = null;// post data
    private final ProgressDialog dialog = new ProgressDialog(MainActivity.this);
    public AsyncHttpPost(HashMap<String, String> data) {
        mData = data;
    }
    @Override
    protected void onPreExecute() {
    super.onPreExecute();
    dialog.setMessage("Please Wait.");
         dialog.setCancelable(true);
         dialog.show();
    }
@Override
    protected String doInBackground(String... params) {
        byte[] result = null;
        String str = "";
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(params[0]);// in this case, params[0] is URL
        try {
            ArrayList<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
            Iterator<String> it = mData.keySet().iterator();
            while (it.hasNext()) {
                String key = it.next();
                nameValuePair.add(new BasicNameValuePair(key, mData.get(key)));
            }
            post.setEntity(new UrlEncodedFormEntity(nameValuePair, "UTF-8"));
            HttpResponse response = client.execute(post);
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){
                result = EntityUtils.toByteArray(response.getEntity());
                firstResultStr = new String(result, "UTF-8");
                jsonParser();
            }
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
        }
        return str;
    }
    @Override
    protected void onPostExecute(String result) {
    if (dialog.isShowing())
            {
                dialog.dismiss();
            }
    mAdapter.notifyDataSetChanged();
             
    }
}
private void jsonParser(){
        try{
        JSONObject root = new JSONObject(firstResultStr);
        JSONArray jItems = root.getJSONArray("data");
                for(int i=0;i<jItems.length();i++) {
                        JSONObject json_data = jItems.getJSONObject(i);
                        mCstInfo = new CustomInfo();
                        pageIdxInt =  json_data.getInt("pageIdx");
                        cosmeticIdInt =  json_data.getInt("Id");
                        mCstInfo.setmIdStr(Integer.toString(IdInt));
                        cosmeticNameStr = json_data.getString("Name");
                        mCstInfo.setmNameTxtStr(NameStr);
                         mCstList.add(mCstInfo);
                         System.out.println(mCstList.size());                         
    }
    mAdapter.notifyDataSetChanged();
        }catch(JSONException e){
        }

1개의 답변

0 추천
건방진프로그래머 (26,630 포인트) 님이 2013년 4월 22일 답변
님이 주신 블로그를 보고 하니 2번까지는 호출이 되는데 3번째 스크롤 부터는 스크롤이 안되네요
else if (pageIdxInt == 2  && mLockListView == false) {
                        mLockListView = true;
                        Log.i("LOG2", "////////////////////////////////////////////");
                          Log.d("New Page Info", "PageConutInfo : "+ pageCounsStr+" orderByStr : "+orderByStr+" User : "+getIntent().getStringExtra("userIdInt"));
                           Log.i("LOG2", "////////////////////////////////////////////");
                        HashMap<String, String> data = new HashMap<String, String>();
                            data.put("pageIdx", "3");
                            data.put("orderBy", orderByStr);
                            Log.d("orderByStr", orderByStr);
                          Log.d("pageIdxStr", pageIdxStr);
                            data.put("userId", getIntent().getStringExtra("userIdInt"));
                            AsyncHttpPost asyncHttpPost = new AsyncHttpPost(data);
                            asyncHttpPost.execute("URL");
                    } else if (pageIdxInt == 3&& mLockListView == false) {
                        mLockListView = true;
                        Log.i("LOG3", "////////////////////////////////////////////");
                          Log.d("New Page Info", "PageConutInfo : "+ pageCounsStr+" orderByStr : "+orderByStr+" User : "+getIntent().getStringExtra("userIdInt"));
                           Log.i("LOG3", "////////////////////////////////////////////");
                        HashMap<String, String> data = new HashMap<String, String>();
                            data.put("pageIdx", "4");
                            data.put("orderBy", orderByStr);
                            Log.d("orderByStr", orderByStr);
                          Log.d("pageIdxStr", pageIdxStr);
                            data.put("userId", getIntent().getStringExtra("userIdInt"));
                            AsyncHttpPost asyncHttpPost = new AsyncHttpPost(data);
                            asyncHttpPost.execute("URL");
                    }

메소드는 protected void onPostExecute(String result) {
mLockListView = false;
이부분에서 다시 잠금을 해제해주고 있습니다.
해당부분에 대해서는 로직을 천천히 다시한번 살펴보시기 바랍니다
저는 정상적으로 동작하는지라.. .3번째부터 잠겨버렸을지도 모르죠
...