질보다 양이 우선하는 허접안드로이드 프로그램 의뢰를 처리해주고 있다.
어찌나 기능들이 다양한지 덕분에 스터디는 제대로 하네 ㅎㅎ
하다보니 리스트들이 엄청 많은데
SimpleAdapter 로 대충 하려고 했더니 요리조리 잘도 빠져들 나가서
커스텀 시리즈를 하나씩 종류별로 다 만들고 있다.
SimpleAdapter를 선호하는 편인데 Hash Map 에만 넣어주면 이미지건 뭐건 알아서 잘 해주니까 좋다.
myAdapter = new SimpleAdapter(this, groupData, R.layout.couponlist,
new String[] { "title", "desc" }, new int[] {
R.id.textViewListTitle, R.id.textViewListDesc });
mListView.setAdapter(myAdapter);
대략 이런식.
1.context 를 주고,
2.Map의 ArrayList 형을 받고,
3.리스트를 표현할 Layout을 정하고
4.리스트에 값을 가져올 Map의 키와
5. 그 키값에 대응하는 List안의 View들을 대응
이것만으로 오케이
물론 이것마저도 사실 지저분하고 더러운 코드로 보이지만 자바에선 이정도면 짧은 코드인편
그런데 이걸 Custom으로 구현하면 갑자기 일이 커진다.
http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List4.html
나는 짜증나서 이짓 못하겠다.
일단 서버나 array.xml 등등에서 JSON을 다루는 일이 대부분이라서
SQLite DatabaseAdapter (어라 이것도 만들었네)에서도 그냥 죄다 키발키발(key:val)해버렸다.
하나 만들고 리팩토링하면서 생각해봐야지 하고 촥 만들고 보니
Custom ListAdapter라고 해봤자. 결국 getView 만 외부에서 콜백으로 지정할 수 있으면 나머지는 매번 작성할 필요가 없다는 생각이 들었다.
package com.appsoulute.library;
import java.util.List;
import org.json.JSONObject;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
public class CustomJSONListAdapter extends ArrayAdapter
private onGetViewCallback getViewCustomCallBack;
public List
private int listViewResourceId;
Context context;
public CustomJSONListAdapter(Context context,
int listViewResourceId, List
super(context, listViewResourceId, objects);
this.listViewResourceId = listViewResourceId;
this.objects = objects;
this.context = context;
}
/-
* Callbacks from getView
*-
public interface onGetViewCallback {
View getView(final int position, View convertView,
ViewGroup parent);
}
public void setOnGetViewCallback(onGetViewCallback onGetViewCallback) {
getViewCustomCallBack = onGetViewCallback;
}
@Override
public int getCount() {
return objects.size();
}
@Override
public JSONObject getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView==null) {
convertView=(LayoutInflater.from(context)).inflate( listViewResourceId, parent, false);
}
return getViewCustomCallBack.getView(position, convertView, parent);
}
}
이런 형태가 되겠다.
실제 사용은 해당 CallBack 만 채워주면 된다.
groupData = new ArrayList
mListView = (ListView) findViewById(R.id.listViewSearchLocation);
myAdapter = new CustomJSONListAdapter(this, R.layout.bookmarkperformancelist, groupData);
myAdapter.setOnGetViewCallback(getViewListener);
mListView.setAdapter(myAdapter);
요정도로 OnCreate 에 선언해주고
private onGetViewCallback getViewListener = new onGetViewCallback() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
try {
((TextView)convertView.findViewById(R.id.textViewListTitle)).setText(myAdapter.objects.get(position).getString("title"));
((CheckBox)convertView.findViewById(R.id.checkBox1)).setChecked(((ListView)parent).isItemChecked(position));
} catch (JSONException e) {
e.printStackTrace();
}
return convertView;
}
};
리스너를 취향에 맞게 만들어 주시면 되겠다. setText 할때 myAdapter.objects 라고 쓴 부분이 맘에 안드는데 자바 하도 오래간만에 해서 다 까묵었다.
일단 여기까지 올리고 차차 수정해보자.
댓글
댓글 쓰기