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

GridView 질문입니다..

0 추천

현재 그리드뷰 안에 3개의 View(ImageView, LinearLayout, TextView)가 들어가고

LinearLayout에는 Button을 동적으로 생성해주려고 합니다(넘겨주는 ArrayList 안에 ArrayList를 넣은 구조). 코드를 돌려보면 Button의 position이 왔다갔다 하는데...(LinearLayout이 포지션을 잘못 인식하는 듯 합니다...)

왜그런지 잘모르겠네요...ㅠㅠ

 

Adapter의 getView 메소드입니다.

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null){
            convertView = mInflater.inflate(R.layout.row_product_gridview, null);
            holder = new ViewHolder();
            holder.image = (ImageView) convertView.findViewById(R.id.row_product_iv_item);
            holder.option = (LinearLayout) convertView.findViewById(R.id.row_product_ll_option);
            holder.desc = (TextView) convertView.findViewById(R.id.row_product_tv_test);

            for(int i = 0; i < mList.get(position).getmItemOption().size(); i++) {
                Button b = new Button(holder.option.getContext());
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                b.setLayoutParams(params);
                b.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
                b.setTextSize(8);
                b.setText(mList.get(position).getmItemOption().get(i).toString());

                holder.option.addView(b);
            }

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.image.setBackgroundResource(R.drawable.ic_coupon);
        holder.desc.setText(mList.get(position).getmDesc().toString());

        return convertView;
    }

     static class ViewHolder {
        ImageView image;
        LinearLayout option;
        TextView desc;
    }

 

다음은 레이아웃입니다.(row)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/row_product_iv_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:id="@+id/row_product_ll_option"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    </LinearLayout>

    <TextView
        android:id="@+id/row_product_tv_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="24sp"/>
</LinearLayout>

 

taejun (7,240 포인트) 님이 2015년 5월 14일 질문
taejun님이 2015년 5월 14일 수정

3개의 답변

+2 추천
if (convertView == null) {

} else {

}

--- for문으로 버튼을 동적으로 생성하는 코드는 이곳으로 위치를 변경하셔야 합니다.

return convertView;
Gradler (109,780 포인트) 님이 2015년 5월 14일 답변
else 밑에
holder.image.setBackgroundResource(R.drawable.ic_coupon);
holder.desc.setText(mList.get(position).getmDesc().toString());

이부분 말씀하시는거죠?
이쪽의 코드를 옴겼지만 증상은 마찬가지네요 ㅠ
+2 추천
LinearLayout 이 recycle 되기 때문에 생기는 문제 같은데요

Button 생성해서 addView 하기 전에

LinearLayout child view 들을 다 없애보세요

 

for 문 전에

holder.option.removeAllViews()
mamondebaltob (32,750 포인트) 님이 2015년 5월 14일 답변
감사합니다....
혹시 지금 상태에서 버튼들이 동적으로 해당 갯수만큼 추가되다보니 주변 레이아웃이 무너지는것 같은데... 이를 해결할 방법이 있나요...?
Button 넣고 있는 for 문을 if 문 바깥으로 빼보시구요
for 문전에 holder.option.removeAllViews()
해 보세요
아아 윗분 답변이랑 해주신 답변으로 포지션 문제는 해결하였습니다...
다만 지금 동적으로 button이 ArrayList 넘어온대로 추가해주다보니
button이 추가가 안되는 부분들의 레이아웃이 옆에 추가된 button들 레이아웃 때문에 영향을 미치는 것 같아서 질문을 추가로 드린겁니다. ㅠㅠ
리니어.removeAllViews();
if (옵션 아이템 렝쓰) {
   옵션 아이템 추가
}
이렇게 해도 영향을 미친다구요?
if(mList.get(position).getmItemOption().size() > 0)
말씀하시는건가요??
하나의 GridView 아이템 안에
Image, LinearLayout(Button들), TextView가 들어가는데
GridView를 2열로 맞추어서 했을 때
GridView의 한 행 중 Button이 있어 LinearLayout이 생기기 때문에 옆의  칸의 문제가 생기는듯 합니다... Button이 들어간 곳은 TextView가 짤리면서 같은 행의 옆의 칸에 GridView 아이템이 조금 내려가면서 이상해지네요...
–1 추천
Holder를 사용해 보세요.

저는 position 보다 아이템마다 웹에서 이미지를 불러오는데 순서가 꼬이는 경우가 있어서 holder로 해결 되었던거 같은 기억이 나요.

google 에서  "android listview holder" 로 검색하면 많이 나오실꺼에요.
디너 (730 포인트) 님이 2015년 5월 14일 답변
holder class를 현재 코드 밑에서 선언하구, 불러서 사용하는 중입니다. ㅠㅠ
...