티스토리 뷰

github.com/Sienna94/AndroidReview

 

Sienna94/AndroidReview

안드로이드 로그인 get방식 리뷰. Contribute to Sienna94/AndroidReview development by creating an account on GitHub.

github.com

 

먼저 제품 이미지 출력을 위한 글라이드를 설치한다.

app의 build.gradle에 다음 코드를 붙여넣고 sync해준다.

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
...
    implementation 'com.github.bumptech.glide:glide:3.7.0'

}

 

item.xml에는 제품의 이미지가 들어갈 ImageView를 만들어준다.

 

이후 MyListActivity에서 list에 출력될 ItemData 클래스를 가져오고

glide를 이용해서 바꿔줄 pimg(item.xml), listview인 LvMain,

listview와 item.xml을 연결해줄 MyAdapter를 전역에 선언해준다.

 

여기서 adapter가 setAdapter, notifyDataSetChanged의 위치가 중요한데,

response를 arr에 추가해준뒤,

notifyDataSetChanged로 arr의 data 변경을 반영하고!

그 이후에 onCreate로 다시 돌아와서 변경사항을 반영하여 SetAdapter로 보여준다.

리퀘스트 보내기/받아온 response인 JSON을 리스트뷰에 보여줄 arr에 넣어주기

 

마지막으로 글라이드를 사용해서 pimg를 변경해주기만 하면 된다.

다음과 같이 작성한다.

 

다음과 같이 잘 출력되는 걸 확인할 수 있다.

 

 

...
public class MyListActivity extends AppCompatActivity {

    ArrayList<ItemData> arr = new ArrayList<>();
    ImageView iv;
    ImageView pimg;
    ListView lvMain;
    MyAdapter adapter; //전역에서 안쓰면 못 불러옴.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_list);
        iv=findViewById(R.id.iv_title);
        pimg=findViewById(R.id.iv_pimage);
        lvMain = findViewById(R.id.lv1);

        //post방식으로 받아오기//
        RequestQueue stringRequest = Volley.newRequestQueue(this);
        String url = "http://192.168.7.26:8180/oop/androidProductList.do";

        StringRequest myReq = new StringRequest(Request.Method.POST, url,
                successListener, errorListener);
        myReq.setRetryPolicy(new DefaultRetryPolicy(3000, 0, 1f)
        );
        stringRequest.add(myReq);
        adapter = new MyAdapter(this);
        lvMain.setAdapter(adapter);
        
...
        });

    }
...
    Response.ErrorListener errorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("prolist", "제품리스트 실패");
        }
    };
    Response.Listener<String> successListener = new Response.Listener<String>() {
        //가져온 jsonArray 리스트뷰로 나타내기
        @Override
        public void onResponse(String response) {
            try {
                JSONArray proArr = new JSONArray(response);

                for (int i = 0; i < 10; i++) {
                    JSONObject proObj = proArr.getJSONObject(i);
                    String pN = proObj.getString("pname");
                    String pI = proObj.getString("pimage1");
                    String pC = proObj.getString("pcontent");
                    //리스트에 보여줄 어레이에 추가
                    arr.add(i, new ItemData(pN, pI, pC));

                    Log.d("arr", arr.get(i).pName);
                }
                //데이터가 바꼈으니까 여기서 arr 변화를 notifychange해준다!
                adapter.notifyDataSetChanged();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    };


    //리스트 관련
    class ItemHolder {
        TextView tvPnameHolder;
        ImageView ivPimage1Holder;
        TextView tvPcontentHolder;
    }
    class MyAdapter extends ArrayAdapter{
        LayoutInflater lnf;
        public MyAdapter(Activity context) {
            super(context, R.layout.item, arr);
            lnf = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return arr.size();
        }

        @Override
        public Object getItem(int position) {
            return arr.get(position);
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ItemHolder viewHolder;
            if(convertView == null){
                convertView = lnf.inflate(R.layout.item, parent, false);
                viewHolder = new ItemHolder();

                viewHolder.tvPnameHolder = convertView.findViewById(R.id.tv_pname);
                viewHolder.tvPcontentHolder = convertView.findViewById(R.id.tv_pcontent);
                viewHolder.ivPimage1Holder = convertView.findViewById(R.id.iv_pimage);

                convertView.setTag(viewHolder);
            }else{
                viewHolder = (ItemHolder) convertView.getTag();
            }

            viewHolder.tvPnameHolder.setText(arr.get(position).pName);
            viewHolder.tvPcontentHolder.setText(arr.get(position).pContent);

            //제품 사진도 바꿔줌
            Glide.with(MyListActivity.this)
                    .load("http://192.168.7.26:8180/oop/img/shoes/"+arr.get(position).pImage1)
                    .into(viewHolder.ivPimage1Holder);
            Log.d("img", "http://192.168.7.26:8180/oop/img/shoes/"+arr.get(position).pImage1);

            return convertView;
        }
    }

}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함