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

getItemViewType가 마음대로 갱신됩니다.

0 추천

소스가 좀 길어요...ㅠㅠ

 
 
public class custom_plan_view extends BaseAdapter {
static boolean layout_check = false;
static boolean layout_set = false;
static boolean day_set = false;
 
private static final int TYPE_DAY = 0;
private static final int TYPE_LAYOUT = 1;
private static final int TYPE_MAX_COUNT = TYPE_LAYOUT + 1;
 
private ArrayList<get_plan_view_list> m_List;
private ArrayList<Integer> m_day;
int count = 0;
public custom_plan_view() {
m_List = new ArrayList<get_plan_view_list>();
m_day = new ArrayList<Integer>();
}
 
@Override
public int getViewTypeCount() {
// Log.e("11", "추가_ getViewTypeCount");
return TYPE_MAX_COUNT;
}
 
@Override
public int getItemViewType(int position) {
int pos = position;
// Log.e("시발", "시발_추가"+pos);
// Log.e("11", "추가_ getItemViewType"+m_List.get(position).getTitle());
 
count++;
Log.e("", "layout_check_:_"+layout_check+"/"+count);
if (layout_check) {
return TYPE_LAYOUT;
 
} else {
return TYPE_DAY;
}
 
// return mSeparatorsSet.contains(position) ? TYPE_LAYOUT : TYPE_DAY;
 
}
 
@Override
public int getCount() {
// TODO Auto-generated method stub
return m_List.size();
}
 
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return m_List.get(position);
}
 
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
 
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final int pos = position;
final Context context = parent.getContext();
 
int type = getItemViewType(pos);
 
ViewHolder holder;
 
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
if (type == TYPE_LAYOUT) {
layout_set = true;
layout_check = false;
convertView = inflater.inflate(R.layout.plan_view, parent,
false);
convertView.setPadding(100, 0, 100, 0);
 
// 제목
 
TextView name = ViewHolder.get(convertView, R.id.plan_name);
name.setText(m_List.get(pos).getTitle());
// 작은내용
TextView text = ViewHolder.get(convertView, R.id.plan_text);
text.setText(m_List.get(pos).getStory());
// 그림
// ImageView image = ViewHolder.get(convertView, R.id.plan_name);
// 버튼을 터치 했을 때 이벤트 발생
Button btn = ViewHolder.get(convertView, R.id.plan_cancel);
btn.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (pos == (m_List.size() - 1)) {
PlanActivity.m_Adapter.remove(pos);
Plan_markerimage_index.plan_markers_mius(context);
 
}
}
});
layout_check = false;
} else if (type == TYPE_DAY) {
layout_set = false;
PlanActivity.day_count = 1;
convertView = inflater.inflate(R.layout.day_line_stand, parent,
false);
TextView day = ViewHolder.get(convertView, R.id.day_text);
day.setText("   " + PlanActivity.day_count + "일차");
day.setTextSize(17);
 
Button day_line_plus = ViewHolder.get(convertView,
R.id.day_plus);
day_line_plus.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
Log.e("", "day_plus_추가");
layout_check = false;
PlanActivity.day_count++;
PlanActivity.m_Adapter.day_add(2);
}
});
 
}
 
}
 
return convertView;
 
}
 
public void add(String _title, String _name, String _image) {
m_List.add(new get_plan_view_list(_title, _name, _image));
// notifyDataSetChanged();
}
 
public void day_add(int day) {
m_day.add(day);
// notifyDataSetChanged();
}
 
public void remove(int _postion) {
m_List.remove(_postion);
// notifyDataSetChanged();
}
 
public void removeAll() {
m_List.removeAll(m_List);
// notifyDataSetChanged();
}
 
public static class ViewHolder {
@SuppressWarnings("unchecked")
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
}
 
}
 
 
제가 한 리스트에 두가지의 레이아웃을 써야하기 때문에
getViewTypeCount() 
getItemViewType
를 사용했는데 써서 레이아웃을 2개(정보,날짜)끔 생성하게 하는건 만들었습니다.
 
getItemViewType() 에서 저는 정보를 추가할경우 bool값을 조절해서 레이아웃을 출력했습니다.
날짜를 추가할때도 마찬가지로 bool값을 조절하구요.
 
그런데 listview를 스크롤 할때 마다 저절로 추가된 레이아웃이 바뀌길래 viewholder가 문제인가 싶어서
 
해봤지만 딱히 큰 변화는 없었구요.
 
그래서 log.e를써서 다 찍어봤는데
 
getItemViewType이 엄청나게 많이 실행되더라구요..이 함수는 원래 폰을 조금만 만져도 저절로 갱신되는 함수인가요?
 
리스트뷰를 add할때만 갱신되는게 아닌가요???
 
 
 
그리고 제가 만들고있는 어플이
 
화면이 있으면 반으로 잘라서 위에는 지도이고 밑에는 리스트뷰인데
 
리스트뷰에서 안보이는 부분을 추가 할려고하면 분명 정보를 추가했음에도 불구하고 저절로 getItemViewType이 실행되면서 날짜 레이아웃이 추가되버려요. 도대체 어디가 문제인지 모르겠습니다.
 
가르쳐쥬세요.ㅠㅠㅠㅠㅠㅠㅠㅠㅠ
 
금색술 (500 포인트) 님이 2014년 12월 29일 질문

2개의 답변

0 추천
ListView 의 Item 항목들은 무한히 생성되는 것이 아니라, 재활용 되는 것으로 알고 있습니다.

따라서, 스크롤을 한다던지등의 경우, 화면이 갱신되어야 하므로 계속 호출됩니다.
익명사용자 님이 2014년 12월 29일 답변
0 추천

TextView name = ViewHolder.get(convertView, R.id.plan_name);

Button day_line_plus = ViewHolder.get(convertView,R.id.day_plus);
 
이렇게 뷰들을 가져오는 부분은
if (convertView == null) {
..
}
요기 if문 밖에서 해야합니다.
 
nicehee (73,100 포인트) 님이 2014년 12월 29일 답변
...