【问题标题】:ListView - setOnItemClickListener not workingListView - setOnItemClickListener 不起作用
【发布时间】:2015-09-14 20:08:53
【问题描述】:

我正在尝试使用自定义适配器实现列表视图。问题是每当触发 onItemClickListener 事件时它就会崩溃。

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

知道这里可能出了什么问题吗?

【问题讨论】:

    标签: android listview


    【解决方案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();
                }
            });
    

    【讨论】:

    • 它没有那样工作,它说“无法解析符号”;将其更改为此 CardItemData selectedFromList = (CardItemData) (myAdapter.getItemAtPosition(position)); String pos = selectedFromList.getText1(); 现在可以使用了。谢谢你的回答!
    【解决方案2】:

    知道这里可能出了什么问题吗?

    您的getItem 正在返回T,在您的情况下,它是CardItemData 的一个实例,但在这里:

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

    您将其投射到String。您可能希望将其转换为 CardItemData。顺便说一句,Java 支持协变返回类型,所以你应该可以使用

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

    【讨论】:

      【解决方案3】:

      这是一个类型转换问题,您将“CardItemData”类型转换为“String”

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

      使用“getItem”方法获取点击的“CardItemData”项。

      检查下面给出的链接 Android Docs link

      【讨论】:

        猜你喜欢
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多