2010-12-24 3 views
0

EfficientAdapter onListItemClick에서 선택한 항목의 텍스트를 가져 오기 위해 사용해야하는 코드는 무엇입니까?EfficientAdapter 및 클릭 한 항목의 텍스트 클릭

str=(String) ((TextView)l.getItemAtPosition(position)).getText() 

을하지만,이 텍스트 뷰와 이미지 뷰를 들고있는 LinearLayout 뷰를 가져옵니다 때문에 이것은 단지

도와주세요 (코드 here 참조), CastException을 제공합니다 : 나는 노력!

코드의 일부 :

public class Bookmarks extends ListActivity { 
public static Typeface mFace; 
public EfficientAdapter eff; 

private static class EfficientAdapter extends BaseAdapter { 
    private LayoutInflater mInflater; 

    public EfficientAdapter(Context context) { 
     mInflater = LayoutInflater.from(context); 
    } 

    public int getCount() { 
     return DAT.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_item_text, null); 
      holder = new ViewHolder(); 
      holder.text = (TextView) convertView.findViewById(R.id.text); 
      holder.text.setTypeface(mFace); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.text.setText(DAT[position]); 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView text; 
    } 
} 

public Object getItem(int position) { 
    return position; 
} 

public void onResume(Bundle icicle) { 
    eff.notifyDataSetChanged(); 
} 

protected void onListItemClick(ListView l, View v, int position, long id) { 
    //////////CRASHES on next line!!!!!!!!!!!!!!!!!! 
TextView tv = (TextView) l.getItemAtPosition(position); 
    String str = tv.getText().toString(); 

} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    eff = (new EfficientAdapter(this)); 
    setListAdapter(eff); 
    registerForContextMenu(getListView()); 
} 

}이

+0

클릭 처리기의 전체 코드, 특히 클래스 및 함수 정의를 게시하면 도움이됩니다. –

답변

1

정말 충분한 정보 (위 내 댓글 참조) 귀하의 질문에없는, 그러나 여기에 대한 답변에서 추측 :

을 첫째, getText()documented이고 String이 아닌 CharSequence를 반환합니다. 이 문자열을 반환 할 수 있지만 그 사실을 모를 수 있습니다. 그래서 작성하는 안전 할 것입니다 :

str = ((TextView)l.getItemAtPosition(position)).getText().toString() 

둘째, 즉, 작업이 예외가 어디에서 오는 더 나은 아이디어를 얻을 수 있도록 그 문을 분해하려고하지 않는 경우. 이런 식으로 뭔가는, 아마도, 명확 수 있습니다 : 당신의 갱신에 따라

TextView tv = (TextView) l.getItemAtPosition(position); 
str = tv.getText().toString(); 

편집 :

1) onListItemClick을 구현하기 위하여려고하는 경우에, 당신이 호출하여 방법을 시작 있는지 확인 다음과 같이 기본 클래스에 추가합니다. 여기

2)

문제입니다 : (내가 지금 필요하지 않을 것이라고 생각하는 다른 예에서 복사 및 붙여 넣기 한 후이 실현) : ListView.getItemAtPosition는 전혀보기를 반환하지 않습니다; 어댑터 (커서, 배열 항목, 무엇이든간에)에서 항목을 반환합니다. TextView를 얻으려면 findViewById, 또는 더 나은 여전히 ​​ViewHolder를 사용해야합니다. 나는이 작동 생각 : 당신은 여전히 ​​문제가 발생하는 경우

protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    ViewHolder holder = (ViewHolder) v.getTag(); 
    TextView tv = holder.text; 
    String str = tv.getText().toString(); 
} 

, 복사 당신이 받고있는 예외에 대한 역 추적을 붙여주십시오.

+0

고마워요! 좋은 해결책 같아. 나는 쉬운 길로 갔다. 나는 그 위치를 필요로하는 public String 배열을 만들었다. – OkyDokyman