[Android/API]네이버 쇼핑 API 파싱 (2) JSON

2021. 3. 11. 16:48Android/튜토리얼 및 가이드

728x90
반응형
 

[Android Studio/JAVA]네이버 쇼핑 API 파싱 (1) XML

1. 우선 API 등록 후 키 값을 이용해 주소 설정하기  └ 나의 경우 '식품안전나라' API를 사용함 2. 뽑아낼 데이터 데이터명 변수명 데이터명 변수명 번호 num 식품군 group_name 식품코드 food_cd 식품이

anovice-dp.tistory.com

 

<구현 화면>

구현 화면

 

1. 메인액티비티(cat/dog 선택화면)에서 두개의 리스트 생성

public class MainActivity extends AppCompatActivity {

    static public ArrayList<list_item> DataList;
    static public ArrayList<list_item> searchList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().hide();
        mContext = this;

        DataList = new ArrayList<list_item>();
        searchList = new ArrayList<list_item>();
    }
}

 

2. 위 리스트뷰를 사용할 java 클래스에 import

import static com.example.feedproject.MainActivity.DataList;
import static com.example.feedproject.MainActivity.searchList;

 

3. Api파싱 java 클래스 생성 (아래 링크 참고)

 

검색 API 블로그 검색 개발가이드

NAVER Developers - 검색 API 블로그 검색 개발가이드

developers.naver.com

private static void parseData(String responseBody) {
    String image, title, maker, brand, desc, category1, category2, category3, category4;
    JSONObject jsonObject = null;
    int i=0;
    try {
        jsonObject = new JSONObject(responseBody.toString());
        JSONArray jsonArray = jsonObject.getJSONArray("items");

        while (i != 10) {
            JSONObject item = jsonArray.getJSONObject(i);
            image = item.optString("image");
            brand = item.optString("brand");
            category1 = item.optString("category1");
            category2 = item.optString("category2");
            category3 = item.optString("category3");
            category4 = item.optString("category4");
            final String finalImage = image;
            final String finalTitle = brand;
            final String finalDesc = category1 + " > " + category2 + " > " + category3 + " > " + category4;
            final Boolean[] check = {true};

            Handler mHandler = new Handler(Looper.getMainLooper());
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    DataList.add(new list_item(finalImage, finalTitle, finalDesc));
                    searchList.add(new list_item(finalImage, finalTitle, finalDesc));
                }
            }, 0);
            i++;
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

- 10개씩 리스트뷰에 쌓는 방식!!

- 네이버 api는 최대 100개까지 호출 가능 -> display=10으로 해놓고 리스트뷰에 계속 쌓아가는 방식으로 무한대 호출

- Handler를 감싸주지 않으면 오류

 

3. DogMainActivity.java

public void ListViewLoad() {    // 페이지를 처음 갱신할 경우 실행
    Log.d(TAG, "리스트뷰 뿌릴게요");
    Handler mHandler = new Handler(Looper.getMainLooper());
    mHandler.postDelayed(new Runnable() {
        public void run(){
            adapter = new ListViewAdapter(mContext, DataList);
            listview.setAdapter(adapter);
        }
    },0);
    Log.d(TAG, "리스트뷰 뿌렸어요");

    listViewClick();
    listViewScroll();
}

public void ListViewUpdate()    // 페이지가 1 이상일 경우 실행
{
    listViewClick();
    listViewScroll();
    adapter.notifyDataSetChanged();
}

- Handler를 감싸주지 않으면 오류

 

4. 10개씩 호출한 API를 리스트뷰에 호출하면서 스크롤 기능하기

- DogMainActivity.java

public void listViewScroll() {
    ApiExamSearchShop.start += 10;
    listview.setOnScrollListener(new AbsListView.OnScrollListener(){
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && lastItemVisibleFlag && !mLockListView) {
                progressBar.setVisibility(View.VISIBLE);
                mLockListView = true;
                page++;
                try {
                    Thread td = new Thread() {
                        public void run() {
                            ApiExamSearchShop api = new ApiExamSearchShop();
                            api.main(page, keyword);
                        }
                    };
                    td.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        adapter.notifyDataSetChanged();
                        progressBar.setVisibility(View.GONE);
                        mLockListView = false;
                    }
                },1000);
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            lastItemVisibleFlag = (totalItemCount > 0) && (firstVisibleItem + visibleItemCount >= totalItemCount);
        }
    });
}

- activity_dog_main.xml

<ProgressBar
    android:id="@+id/progressbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:indeterminateTint="@color/colorAccent" />

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/progressbar"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>
728x90
반응형