【问题标题】:Highlighting Item In ListView在 ListView 中突出显示项目
【发布时间】:2012-01-05 23:19:25
【问题描述】:

好的,所以我知道这个问题之前已经在这个网站上提出过,但坦率地说,我没有从我所看到的解决方案中得到任何结果。例如,这篇文章:highlighting the selected item in the listview in android 建议您只需为 ListView 设置一个choiceMode。我已经尝试过了,它根本不起作用。

在我的代码中,我有一个 ListView (onListItemClick) 的侦听器,每次触发它时,我都会有类似的内容...getListView().setItemChecked(position, true),除此之外,我还有一个已附加到的 XML 选择器我的列表视图...

<ListView                       
  android:id="@id/android:list"
  android:layout_width="wrap_content"
  android:layout_height="fill_parent"
  android:scrollbars="none"
  android:layout_weight="1.5"
  android:choiceMode="singleChoice"
  android:listSelector="@drawable/bounty_list_selector"/>

我在这里遗漏了什么吗? setItemChecked() 对 ListView 的选择器没有影响吗?

【问题讨论】:

  • 您是否只是想让选择器图形在单击一行时显示? (如果行内的某些内容有自己的 onClickListener,则不会)
  • 我认为 android:listSelector 的想法是处理列表选择(使用 dpad 在列表中移动),它不会影响选中的行。
  • @FunkTheMonk,我试图让列表中的项目“突出显示”或在单击时基本上更改背景颜色,但是我一次只需要“检查”一个项目。

标签: android android-listview


【解决方案1】:

我也遇到过类似的问题,通过代码解决了。它可能不是最聪明也不是最有效的解决方案,但可以解决 ListView 绘图问题,到目前为止似乎运行良好。

活动文件:

private ListView listView;
private View selectedView;
private int selectedPosition;
private MyAdapter arrayAdapter;

...
// set a state machine for when a list item is clicked
    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (selectedPosition == -1) {
                // no item is selected, mark as selected
                selectedView = view;
                view.setBackgroundResource(R.drawable.bg_selected);
                selectedPosition = position;
            } else if (selectedPosition == position) {
                // the same item is selected as the previous one, deselect
                selectedView = null;
                view.setBackgroundResource(R.drawable.bg_unselected);
                selectedPosition = -1;
            } else {
                // another item is selected, deselect the previous and select the new one
                selectedView.setBackgroundResource(R.drawable.bg_unselected);
                selectedView = view;
                view.setBackgroundResource(R.drawable.bg_selected);
                selectedPosition = position;
            }

            arrayAdapter.setSelectedPosition(selectedPosition);
        }
    });

适配器代码:

public class MyAdapter extends ArrayAdapter<MyObject> {
    private int selectedPosition;

    private static class ViewHolder {
        RelativeLayout layout;
        ...
    }

    public void setSelectedPosition(int selectedPosition) {
        this.selectedPosition = selectedPosition;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row, null);
            holder = new ViewHolder();
            holder.layout = (RelativeLayout) convertView.findViewById(R.id.rl_item);
            ...

            convertView.setTag(holder);
        }
        else
            holder = (ViewHolder) convertView.getTag();

        ...
        if (position == selectedPosition)
            holder.layout.setBackgroundResource(R.drawable.bg_selected);
        else
            holder.layout.setBackgroundResource(R.drawable.bg_unselected);
        ...

        return convertView;
     }

     ...
}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2013-11-18
    • 2016-04-10
    • 2011-08-16
    相关资源
    最近更新 更多