2010-12-24 4 views
0

Für EfficientAdapter Welchen Code muss ich unter OnListItemClick verwenden, um Text des ausgewählten Elements zu erhalten? Ich habe versucht:EfficientAdapter und greifen Text von Artikel geklickt

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

Aber das bringt nur CastException, da sie die Linearlayout-Ansicht Halten der Textview und Imageview holt

Bitte helfen (Code here sehen)!

Einige der Code:

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

Es wäre hilfreich, wenn Sie den vollständigen Code Ihres Click-Handlers, insbesondere die Klassen- und Funktionsdefinitionen, posten würden. –

Antwort

1

Es ist nicht wirklich genug Informationen in Ihrer Frage (mein Kommentar siehe oben), aber hier ist eine Vermutung zu einer Antwort:

Zuerst ist getText()documented, um eine CharSequence, kein String zurückzugeben. Es könnte einen String zurückgeben, aber Sie wissen nicht, dass es tut. So wäre es sicherer sein, zu schreiben:

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

Zweitens, wenn das nicht funktioniert, versuchen Sie nach unten zu brechen diese Aussage, so dass Sie eine bessere Vorstellung davon zu bekommen, wo die Ausnahme herkommt. So etwas wie dies, könnte vielleicht klarer sein:

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

EDIT basierend auf Ihrem Update:

1) Wenn du gehst onListItemClick zu implementieren, sicher sein, dass Sie die Methode durch Aufruf beginnen zur Basisklasse, wie unten gezeigt.

2) Hier ist das Problem: (Ich erkannte dies, nachdem sie in einem anderen Beispiel das Kopieren und Einfügen, das glaube ich jetzt nicht nötig sein): ListView.getItemAtPosition überhaupt einen Blick nicht zurück; Sie gibt ein Element von Ihrem Adapter zurück (ein Cursor, ein Array-Eintrag, was auch immer.) Um die TextView zu erhalten, müssen Sie findViewById, oder noch besser, Ihren ViewHolder verwenden. Ich denke, dies funktionieren wird:

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

Wenn Sie immer noch Probleme haben, bitte kopieren und Traceback für die Ausnahme einfügen, die Sie bekommen.

+0

Vielen Dank! sieht nach einer guten Lösung aus. Ich ging den leichten Weg. Ich habe ein öffentliches String-Array erstellt, das nur die Position benötigt. – OkyDokyman

Verwandte Themen