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

Listview 목록들 순서가 꼬임....

0 추천
package com.example.ysgridproject;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;

public class L2Adapter extends ArrayAdapter<String[]> {


	ArrayList<String[]> items ;
	Context context;
	int FixCol ;

	ArrayList<LinearLayout> L2a1bs = new ArrayList<LinearLayout>();
	ArrayList<LinearLayout> L2a2bs = new ArrayList<LinearLayout>();
	
	public L2Adapter(Context con, int textViewResourceId ,ArrayList<String[]> objects , int fixcol) {
		super(con, textViewResourceId ,objects);
		context=con;
		items=objects;
		FixCol = fixcol;
		
	}
	
	LinearLayout L2;
	LinearLayout L2a1;
	LinearLayout L2a2;
	int mm = -1 ;
	
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View view = convertView;
		System.out.println("converview = " + view);

		if( view == null){
 			L2= new LinearLayout(context);
			ListView.LayoutParams L2Param = new ListView.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
			L2.setLayoutParams(L2Param);
			
			L2a1 = new LinearLayout(context);
			L2a2 = new LinearLayout(context);
			LayoutParams L2a1Param = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT);
			LayoutParams L2a2Param = new LayoutParams( (items.get(0).length-FixCol)*150+10 ,LayoutParams.MATCH_PARENT);
			L2a1.setOrientation(LinearLayout.VERTICAL);
			L2a2.setOrientation(LinearLayout.VERTICAL);
			L2a1.setLayoutParams(L2a1Param);
			L2a2.setLayoutParams(L2a2Param);
			
			L2.addView(L2a1);
			L2.addView(L2a2);
			view = L2;
		}


		
		LinearLayout L2a1b = new LinearLayout(context);	//L2a1b 매번 초기화 되기때문에 의미있게 L2a1b 에 담는다.
		LayoutParams L2a1bParam = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
		L2a1b.setLayoutParams(L2a1bParam);
		L2a1b.setOrientation(LinearLayout.HORIZONTAL);
		
		LinearLayout L2a2b = new LinearLayout(context);
		LayoutParams L2a2bParam = new LayoutParams((items.get(0).length-FixCol)*150+10 ,LayoutParams.WRAP_CONTENT);
		L2a2b.setLayoutParams(L2a2bParam);
		L2a2b.setOrientation(LinearLayout.HORIZONTAL);
		
		
		for(int i = 0 ; i < FixCol ; i ++){		//content 내용 		// ┌-------------------------┐
																				// │		│			│		│		 │
			TextView tvtitle = new TextView(context);			// │ 		│			│		│		 │
			tvtitle.setText(items.get(position)[i]);					// │		│			│		│		 │
			tvtitle.setWidth(150);										// └-------------------------┘
			tvtitle.setHeight(100);
			tvtitle.setTextSize(20);
			tvtitle.setGravity(Gravity.CENTER);
			tvtitle.setBackgroundColor(Color.parseColor("#FFDAB9"));
			L2a1b.addView(tvtitle);
			
		}
		for(int i = FixCol ; i < items.get(position).length ; i ++){

			TextView tvtitle1 = new TextView(context);
			tvtitle1.setText(items.get(position)[i]);
			tvtitle1.setWidth(150);
			tvtitle1.setHeight(100);
			tvtitle1.setTextSize(20);
			tvtitle1.setGravity(Gravity.CENTER);
			tvtitle1.setBackgroundColor(Color.parseColor("#DAA520"));
			L2a2b.addView(tvtitle1);
			
		}
		


		
		if(mm<position){		// getview 가 중복호출 됫을때 중복처리하지 않게 하기 위하여 position 마다 각각한번씩만 적용되도록한다.
			
			L2a2bs.add(L2a2b);		// L2ab(LinearLayout) 에 가로로 내용들을 담은 내용을 의미있게 List에 담는다.
			L2a1bs.add(L2a1b);
			System.out.println("L2a1bs.get("+(mm+1) +") 에  들어간다"  );
			L2a1.addView(L2a1bs.get((mm+1)));		// 그 List 에들어있는 layout 중 position 에 해당하는 값만 addview 
			L2a2.addView(L2a2bs.get((mm+1)));

			mm=position;
		}

				
		System.out.println("-----------------------------------------------");
		return view;
	}


}

 

 

 

 

검색안해본게아니라.. 다검색해봐도 뭐가먼지 2틀째 끙끙 거리고있습니다..

일단은 1차원배열을 List 로 받아서 뿌려주는 소스입니다

커스텀으로 LinearLayout 2개를 합쳐 하나의 레이아웃으로 만들어 리턴해주고있습니다

다출력은되는데 14개가 있다면  10개가 화면에보여지고 12개쯤부터는 view 를 새로 안만들고 재활용해서 

사용하기때문에 첫번째 index가 13번째에 복사해서 붙여져있고 계속 스크롤하다보면 전체적으로 뒤죽박죽이 됩니다..

 

어떻게해결해야할까요...  view 가 Null 이 아닐때를 구현해야할것 같은데 ..

방향을 못잡겠습니다.

재활용 뷰에 textview 를 가져와 settext 로 바꾸고싶은데 접근을못하겠어요 ..

타키믹 (400 포인트) 님이 2013년 7월 24일 질문

1개의 답변

0 추천
 
채택된 답변
aucd29 (218,390 포인트) 님이 2013년 7월 24일 답변
타키믹님이 2013년 7월 25일 채택됨
viewHolder 를 사용해야지만 가능한건가요?
여기는 저도 보기는했는데 안쓰고도 가능할꺼같아서...
new 는 null 쪽에서 다 하고 값만 변경하는 식으로 해야 되며
레이아웃이 바뀌면
레이아웃이 바뀌는 종류 별로 작업하셔야 합니다.
@Override
public int getViewTypeCount() {

    return tourList.size();

}

@Override
public int getItemViewType(int position) {

    return position;
}

두메소드를 확인해보세요
일단 남의코드를보고 설명해주신다는것 자체 너무나 감사합니다~
근데 레이아웃이 바뀌면 바뀌는 종류별로 해야한다는것 자체를 이해를못하겠습니다... 그리고 두메소드를 쳐도 사용한 거밖에없고 설명은 잘안나와있네요 ㅠ
재활용뷰를 수정을 못해서 계속이러는거같아요...
뷰 형태가 달라지면 뷰를 재활용하지 않고 따로 만들어야 된다는 이야기 입니다.
View 모양이 다른 종류가 있으면 getViewTypeCount 에 다른 종류별로 숫자를 넣고 getItemViewType 위치값에 따라 다르게 타입을 전달해야 합니다.
아아 무슨말인지 알겠습니다 감사합니다 ^^ 어느정도알았으니 삽질하러가봐야겠네요 ㅠ
...