Android - 在项目上单击listview没有响应

时间:2014-12-25 20:40:59

标签: android android-listview onitemclicklistener

enter image description here

我尝试做的是当我点击列表中任何会改变文字颜色和可绘制颜色的项目时 这是我的getview方法

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
        LayoutInflater mInflater = (LayoutInflater)
                mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        convertView = mInflater.inflate(R.layout.nav_drawer_item, null);
        convertView.setFocusable(false);

        final TextView mItemTitle = (TextView) convertView.findViewById(R.id.item_title_tv);
        mItemTitle.setText(mNavDrawerItems.get(position).getmItemTitle());

        final ImageView mTitleIcon = (ImageView) convertView.findViewById(R.id.item_icon_iv);
        mTitleIcon.setImageDrawable(
                mContext.getResources().getDrawable(mNavDrawerItems.get(position).getmItemIcon()));

        if (position == 0)
        {
            convertView = mInflater.inflate(R.layout.nav_drawer_header, null);
        }
        else if (position == 1)
        {
            /*
            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view)
                {
                    setColorAndDrawble(mItemTitle, mTitleIcon,
                            mContext.getResources().getColor(R.color.last_news_click_color),
                            mContext.getResources().getDrawable(R.drawable.ic_class_news_click));
                }
            });
            */
        }
        else if (position == 2)
        {

            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view)
                {
                    setColorAndDrawble(mItemTitle, mTitleIcon,
                            mContext.getResources().getColor(R.color.public_chat_click_color),
                            mContext.getResources().getDrawable(R.drawable.ic_public_chat_click));
                }
            });
        }
        else if (position == 3)
        {
            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view)
                {
                    setColorAndDrawble(mItemTitle, mTitleIcon,
                            mContext.getResources().getColor(R.color.messages_click_color),
                            mContext.getResources().getDrawable(R.drawable.ic_messages_click));
                }
            });
        }
        else if (position == 4)
        {
            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view)
                {
                    setColorAndDrawble(mItemTitle, mTitleIcon,
                            mContext.getResources().getColor(R.color.results_click_color),
                            mContext.getResources().getDrawable(R.drawable.ic_results_click));
                }
            });
        }

        return convertView;
}

private void setColorAndDrawble(TextView textView, ImageView imageView, int color, Drawable drawble)
{
    imageView.setImageDrawable(drawble);
    textView.setTextColor(color);
}

现在的问题是listview的监听器无法正常工作。为什么呢?

mDrawerList.setOnItemClickListener(new SlideMenuClickListener());    

private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {

            Log.e("SlideMenuClickListener", position + "");
            TextView textView = (TextView) view.findViewById(R.id.item_title_tv);
            textView.setTextColor(getResources().getColor(R.color.last_news_click_color));
            Log.e("textView", textView.getText() + "");
            // display view for selected nav drawer item
            displayView(position);
        }
    }

3 个答案:

答案 0 :(得分:0)

您的方法可能被视为错误,您应该为每个listview项创建一个类和一个自定义适配器,同样不应该为每个元素使用setOnClickListener

建议使用ViewHolder。

有关详细信息,请查看this链接或官方文档。

答案 1 :(得分:0)

为行设置单击侦听器时,会阻止ListView的正常单击处理。您可以通过将用于更新行的整个逻辑移动到onItemClick方法来解决此问题。 (您已经在那里复制了文本颜色更改逻辑。)

private class SlideMenuClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(ListView parent, View view, int position, long id) {

        Log.e("SlideMenuClickListener", position + "");
        TextView textView = (TextView) view.findViewById(R.id.item_title_tv);

        if (position > 0) {
            textView.setTextColor(getTextColor(position),
                textView.getTextColors().getDefaultColor());
            final ImageView titleIcon = (ImageView) view.findViewById(R.id.item_icon_iv);
            titleIcon.setImageDrawable(getImage(position));
            parent.getAdapter().getView(i, view, list);
        }
        Log.e("textView", textView.getText() + "");
        // display view for selected nav drawer item
        displayView(position);
    }

    private int getTextColor(int position, int defaultColor) {
        final Resources res = getContext().getResources();
        int color = defaultColor;
        switch (position) {
            case 2: color = res.getColor(R.color.public_chat_click_color); break;
            case 3: color = res.getColor(R.color.messages_click_color);    break;
            case 4: color = res.getColor(R.color.results_click_color);     break;
        }
        return color;
    }

    private Drawable getImage(int position) {
        int resId = mNavDrawerItems.get(position).getmItemIcon()); // default
        switch (position) {
            case 2: resId = R.drawable.ic_public_chat_click; break;
            case 3: resId = R.drawable.ic_messages_click;    break;
            case 4: resId = R.drawable.ic_results_click;     break;
        }
        return getContext().getDrawable(resId);
    }
}

您可以使用视图持有者模式(按照this tutorial中的建议)改进此方法的整体性能。这涉及将每行的标记设置为一个小对象,该对象引用该行的文本和图像视图。

答案 2 :(得分:0)

我通过将setOnTouchListener添加到我的适配器类中的convertView来解决了这个问题,并且它现在正常工作