ListView 자체에서 onItemClickListener를 사용하지 않는 이유는 무엇입니까?
어댑터에는 하나의 개체 유형 목록이 있어야합니다 (엄격한 규칙은 없지만 항목을 훨씬 쉽게 관리하는 데 도움이됩니다). 예를 들어
class MsgObject{
String msg;
String data
//TODO Getters/Setters goes here
}
는 그런 다음 CustomAdapter은
List<MsgObject> objectList;
그런 다음 당신의 getView의 의지는 이제보기가 하나의 객체가 아닌 하나의 레이아웃으로이 문제를 처리 할이
MsgObject m = (MsgObject)getObject(position);
TextView text=(TextView)vi.findViewById(R.id.text);
ImageView image=(ImageView)vi.findViewById(R.id.image);
text.setText(m.getMsg());
text.getLineCount();
imageLoader.DisplayImage(m.getData(), image);
//Tag id is predefined in xml
vi.setTag(R.id.listItemTag, m);
return vi;
과 유사 포함됩니다 여러 값으로.
그런 다음 우리의 ListView가 상주하는 활동에 모든 클릭 동작을 이동합니다.
listView.setOnItemClickListener(){
new AdapterView.OnItemClickListener(){
@override
public onItemClick(AdapterView<?> parent, View view, int position, long id){
MsgObject m = (MsgObject)view.getTag(R.id.listItemTag);
Toast.makeText(context, "Pos[" + position
+ "] clicked, with msg: " + m.getMessage(), Toast.LENGTH_SHORT).show();
}
}
};
이것은 나뿐만 아니라 게으른로드 이미지 뷰 내 목록보기있는 방법입니다. 그러면 해당 뷰에 연결된 객체와 클릭 한 위치에 액세스 할 수 있습니다.
msg와 데이터를 분리하려는 경우. setTag (id, obj);를 사용할 수 있습니다. 두 객체 등
setTag(R.id.listItemMsg, msg[position]);
setTag(R.id.listItemData, data[position]);
UPDATE : 내 CustomAdapter의 예
/**
* Adapter for displaying Place selection list.
* @author Poohdish Rattanavijai
*
*/
public class PlaceAdapter extends BaseAdapter {
private static final String TAG = PlaceAdapter.class.getSimpleName();
private List<PlaceVO> list; // <-- list of PlaceVOs
private Context context;
private int viewResourceId;
/**
*
* @param context Context
* @param viewResourceId Layout ID for each item
* @param list resource list to populate
*/
public PlaceAdapter(Context context, int viewResourceId, List<PlaceVO> list){
this.context = context;
this.viewResourceId = viewResourceId;
this.list = list;
}
/**
* Number of result in the list plus one (for +add at the last item)
*/
@Override
public int getCount() {
if(null != list){
return list.size();
}
return 1;
}
@Override
public Object getItem(int arg0) {
if(null != list){
try {
return list.get(arg0);
} catch (IndexOutOfBoundsException e) {
return null;
}
}
return null;
}
@Override
public long getItemId(int position) {
// if(null != list){
// try {
// return list.get(position).getId();
// } catch (IndexOutOfBoundsException e) {
// return 0;
// }
// }
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(null == convertView){
/**
* View does not exist, populate.
*/
LayoutInflater inflater = LayoutInflater.from(this.context);
convertView = inflater.inflate(this.viewResourceId, parent, false);
}
ViewHolder holder = (ViewHolder)convertView.getTag(R.id.adpter_view);
if(null == holder){
Log.d(TAG, "holder not found, init.");
/**
* ViewHolder does not exists for this view; create and assign respective view.
*/
holder = new ViewHolder();
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.details = (TextView) convertView.findViewById(R.id.details);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
}
PlaceVO v = (PlaceVO)getItem(position); // <-- GetItem
if(null != v){
Log.d(TAG, "Place not null");
if(HelperUtil.IsNotNullOrEmpty(v.getName())){
Log.d(TAG, "Name: " + v.getName());
holder.title.setText(v.getName());
}
if(HelperUtil.IsNotNullOrEmpty(v.getVicinity())){
Log.d(TAG, "details: " + v.getVicinity());
holder.details.setText(v.getVicinity());
}
if(HelperUtil.IsNotNullOrEmpty(v.getIcon())){
holder.progress.setVisibility(View.VISIBLE);
holder.icon.setVisibility(View.GONE);
//TODO Initialize LazyLoad
}else{
holder.progress.setVisibility(View.VISIBLE);
holder.icon.setVisibility(View.GONE);
}
}
// Two tags, one for holder, another for the VO
convertView.setTag(R.id.adpter_view, holder);
convertView.setTag(R.id.adpter_object, v);
return convertView;
}
static class ViewHolder{
TextView title;
TextView details;
ImageView icon;
ProgressBar progress;
}
}
내부 활동 나는이 질문 :
대답
OnItemClickListener itemClick = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
PlaceVO v = (PlaceVO)arg1.getTag(R.id.adpter_object); // <-- get object using tag.
switchToPlaceScreen(v);
}
};
listView.setOnItemClickListener(itemClick);
희망으로 항목 클릭 동작을 처리
항목 번호는 어디에서 비롯 되었습니까? 특정 뷰에 특정한 아이템 번호로'setTag'을 사용하지 않으시겠습니까? – Cody