【问题标题】:Android - On Item click of listview not respondingAndroid - 在列表视图的项目单击没有响应
【发布时间】:2014-12-25 20:40:59
【问题描述】:

我想要做的是当我点击列表中任何会改变文本颜色和可绘制对象的项目时 这是我的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);
        }
    }

【问题讨论】:

    标签: android android-listview onitemclicklistener


    【解决方案1】:

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

    也建议使用 ViewHolder。

    更多详情请查看this链接或官方文档。

    【讨论】:

      【解决方案2】:

      我通过在我的 adpater 类中添加 setOnTouchListener 到 convertView 解决了这个问题 :) 现在它工作正常

      【讨论】:

      • 你能发布最终为你工作的代码吗?
      【解决方案3】:

      当您为一行设置点击侦听器时,这会阻止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 中的建议)来提高此方法的整体性能。这涉及将每一行的标记设置为一个小对象,该对象引用该行的文本和图像视图。

      【讨论】:

      • @user3871129 - 我不知道。我试图模仿你的代码,但也许我弄错了。您应该能够修复逻辑。重要的想法是方法:在onItemClick 中进行更改。
      • 还是同样的问题,文本视图和图标的颜色没有改变
      • @user3871129 - 嗯。您可能需要添加一行代码来强制刷新行(如 this thread 中所述。)我更新了示例代码以展示其工作原理,并修复了一些其他明显的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多