2015-09-14 102 views
1

我想用自定義適配器實現列表視圖。問題是,只要觸發了onItemClickListener事件,它就會崩潰。ListView - setOnItemClickListener不工作

java.lang.ClassCastException:imp.translator.diana.lang.CardItemData 不能轉換爲java.lang.String 在imp.translator.diana.lang.Speak $ 1.onItemClick(Speak.java: 41) 在android.widget.AdapterView.performItemClick

這是我的課:

final ListView list = (ListView) findViewById(R.id.list_view); 

    list.addHeaderView(new View(this)); 
    list.addFooterView(new View(this)); 

    BaseInflaterAdapter<CardItemData> adapter = new BaseInflaterAdapter<CardItemData>(new CardInflater()); 

    CardItemData data = new CardItemData("Translate"); 
    adapter.addItem(data, false); 
    CardItemData data2 = new CardItemData("Voice to Text"); 
    adapter.addItem(data2, false); 
    CardItemData data3 = new CardItemData("Record"); 
    adapter.addItem(data3, false); 
    CardItemData data4 = new CardItemData("Info"); 
    adapter.addItem(data4, false); 

    list.setAdapter(adapter); 

    list.setClickable(true); 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView myAdapter, View myView, int position, long mylng) { 
      String selectedFromList = (String) (myAdapter.getItemAtPosition(position)); 
     } 
    }); 

和我的適配器:

public class BaseInflaterAdapter<T> extends BaseAdapter 
{ 
    private List<T> m_items = new ArrayList<T>(); 
    private IAdapterViewInflater<T> m_viewInflater; 

    public BaseInflaterAdapter(IAdapterViewInflater<T> viewInflater) 
    { 
     m_viewInflater = viewInflater; 
    } 

    public BaseInflaterAdapter(List<T> items, IAdapterViewInflater<T> viewInflater) 
    { 
     m_items.addAll(items); 
     m_viewInflater = viewInflater; 
    } 

    public void setViewInflater(IAdapterViewInflater<T> viewInflater, boolean notifyChange) 
    { 
     m_viewInflater = viewInflater; 

     if (notifyChange) 
      notifyDataSetChanged(); 
    } 

    public void addItem(T item, boolean notifyChange) 
    { 
     m_items.add(item); 

     if (notifyChange) 
      notifyDataSetChanged(); 
    } 

    public void addItems(List<T> items, boolean notifyChange) 
    { 
     m_items.addAll(items); 

     if (notifyChange) 
      notifyDataSetChanged(); 
    } 

    public void clear(boolean notifyChange) 
    { 
     m_items.clear(); 

     if (notifyChange) 
      notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() 
    { 
     return m_items.size(); 
    } 

    @Override 
    public Object getItem(int pos) 
    { 
     return getTItem(pos); 
    } 

    public T getTItem(int pos) 
    { 
     return m_items.get(pos); 
    } 

    @Override 
    public long getItemId(int pos) 
    { 
     return pos; 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent) 
    { 
     return m_viewInflater != null ? m_viewInflater.inflate(this, pos, convertView, parent) : null; 
    } 
} 

和CardItemData:

public class CardItemData 
{ 
    private String m_text1; 
    public CardItemData(String text1) 
    { 
     m_text1 = text1; 
    } 
    public String getText1() 
    { 
     return m_text1; 
    } 
} 

任何想法可能是錯誤的嗎?

回答

1

java.lang.ClassCastException:imp.translator.diana.lang.CardItemData 不能轉換爲java.lang.String

上述異常是源於 String selectedFromList = (String) (myAdapter.getItemAtPosition(position));這裏你嘗試CardItemData轉化爲String

試試這個:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView myAdapter, View myView, int position, long mylng) { 
       CardItemData selectedFromList = (CardItemData) (myAdapter.getItemAtPosition(position)); 
       String pos = selectedFromList.getText1(); 
      } 
     }); 
+0

給它沒有工作方式,它說:「不能解析符號」; 將其更改爲此 CardItemData selectedFromList =(CardItemData)(myAdapter.getItemAtPosition(position)); String pos = selectedFromList.getText1();它現在可用。謝謝您的回答! – Diana

+0

ok會更新。 – Rustam

1

任何想法這裏可能是錯誤的?

getItem正在恢復T是,在你的情況下,CardItemData一個實例,但在這裏:

String selectedFromList = (String) (myAdapter.getItemAtPosition(position)); 

你是它鑄造String。您可能想將它投射到CardItemData。順便說一句,Java支持協變返回類型,所以你應該能夠使用

@Override 
public T getItem(int pos) { 
    return m_items.get(pos); 
} 
0

它的類型轉換的問題,你是類型轉換 「CardItemData」 到 「串」

字符串selectedFromList =(字符串)(myAdapter.getItemAtPosition(位置));

使用「getItem」方法獲得點擊「CardItemData」項目。

檢查下面的鏈接 Android Docs link

相關問題