2012-02-05 2 views
1

일부 이미지의 일부 지연로드를 수행 한 다음 레이아웃을 부 풀릴 사용자 정의 baseadapter가있어서 하나의 이미지와 텍스트가 모두있는 listview로 끝납니다 열.맞춤 어댑터 : 부풀린 목록보기에서 클릭 한 항목의 항목 번호 가져 오기

사용자가 목록보기의 한 항목, 예를 들어 항목 0 (최상위 항목)을 누르면 일부 특정 내용이 포함 된 대화 상자가 표시됩니다. 이 내용은 항목 번호에 따라 달라 지므로 항목 0에 대해 표시된 내용이 항목 1에 대한 내용과 동일하지 않습니다. 여기

사용자 정의 어댑터의 getView 방법 :

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View vi=convertView;   
    if(convertView==null) 
    { 
     vi = inflater.inflate(R.layout.facebook_item, null);       
     vi.setClickable(true); 
     vi.setOnClickListener(new OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      {     
       String s = "test"; 
       Toast.makeText(myContext, s, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    }   

    TextView text=(TextView)vi.findViewById(R.id.text); 
    ImageView image=(ImageView)vi.findViewById(R.id.image); 
    text.setText(msg[position]); 
    text.getLineCount(); 
    imageLoader.DisplayImage(data[position], image); 
    return vi; 
} 

무엇 onClick 방법에 무슨 일이 일어나고 있는지 여기 중요합니다. 항목 매개 변수가 필요하지만이 OnClickListener에는 불가능합니다. 정상적인 목록보기는 가능합니다.

그래서 - 클릭 한 항목을 어떻게 결정할 수 있습니까?

추신 : 나는 어떤 종류의 vi.setTag(<<number>>);을 사용하려고 생각했으나 목록보기의 모든 항목에 대해 동일한 태그를 설정하지 않으면 어떻게되는지 알 수 없습니다.

+0

항목 번호는 어디에서 비롯 되었습니까? 특정 뷰에 특정한 아이템 번호로'setTag'을 사용하지 않으시겠습니까? – Cody

답변

5

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); 

희망으로 항목 클릭 동작을 처리

+0

고마워요. 그 클래스 MsgObject를 작성하는 방법을 자세히 설명해 주시겠습니까? getMsg() 및 getData() 메서드를 작성하지 않았 음을 의미합니다. 실제 msg 및 데이터 문자열은 어디에 설정됩니까? 또한'objectList'는 어디에 사용되어야합니까? – eightx2

+0

getter/setter가 필요합니다. 간단하게 유지하기 위해 생략했습니다. – RobGThai

+0

먼저 게시 한 코드와 다른 예를 조합하여 사용할 수 있도록 관리합니다. 건배! – eightx2

1
text.setText(msg[position]); 
text.getLineCount(); 
imageLoader.DisplayImage(data[position], image); 

사용자 정의 어댑터를 만들 때 가능한 한 getItem (int 위치)을 사용하여 항목을 참조하려고합니다.Adapter 생성자에서 전달한 실제 배열을 사용하여 참조하지 마십시오.

어댑터에서 getItem(int position)getItemId(int position)을 무시하고 배열 자체 대신 getView 내부에서 사용하십시오.

관련 문제