ListView - 显示其他颜色的最顶级项目

时间:2013-05-29 20:58:17

标签: android android-listview

我正在编写一个由RCU控制的Android应用程序,而不是触摸事件/手指。该RCU具有UP,DOWN,LEFT,RIGHT和OK键(简化)。这意味着在当前突出显示的图形对象上处理“确定”按钮。例如,想想旧DVD播放器的界面。

我正在尝试为此目的调整ListView。假设我想呈现5个选项的垂直列表:

  • 是(红色)
  • 可能(白色)
  • 当然(白色)
  • 可能(白色)
  • 从不(白色)

最初,第一个选项是,应该是某种颜色(高光/焦点颜色),而其他4个选项是另一种颜色(默认颜色)。

当用户按下UP时,可能会翻译到顶部并以高亮/焦点颜色显示;是在列表底部添加,并以默认颜色显示:

  • 可能(红色)
  • 当然(白色)
  • 可能(白色)
  • 从不(白色)
  • 是(白色)

可通过ArrayAdapter向ListView提供可能的选项:

    public class DetailOptionsItemAdapter extends ArrayAdapter<String> {
        public DetailOptionsItemAdapter(Context context, String[] options) {
            super(context, R.layout.options, options);
        }
    }

在派生ListView的类的构造函数中:

    setAdapter(new DetailOptionsItemAdapter(getContext(), new String[]{"Yes", ...})));

我的布局(R.layout.options)定义如下:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:textColor="@color/white"
    android:textColorHighlight="@color/red"
    android:includeFontPadding="true"
    android:ellipsize="end"
    android:singleLine="true"/>

收到UP或DOWN时,我将请求的索引翻译到顶部:

    smoothScrollToPositionFromTop(... the index ..., 0);

这很有效。到目前为止,所有内容都以白色显示,默认颜色。

现在我需要插入第一项永远是红色的。我尝试将视图放在旧位置并给它一些颜色,然后将视图放在新位置并给它一个红色,但没有成功。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我从不擅长在代码中设置文本颜色,但是你不能只是覆盖适配器中的getView()方法,然后根据项目在列表中的位置,你可以设置文字颜色吗?

即:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final TextView v =  (TextView) super.getView(position, convertView, parent);

        if (0 == position) {
            v.setTextColor(blah);
        } etc..
    }

答案 1 :(得分:0)

我已经制作了一个小实验,用于通过实用的方式实现ListView的列表选择器属性。

你需要创建自定义适配器和getView()方法,只需检查选定项目位置的条件并为其应用颜色。

  class Adapter extends BaseAdapter{
        private Context context;
        private ArrayList<Setter> setter = new ArrayList<Setter>();
        private int pos;

        public Adapter(Context context, ArrayList<Setter> list) {
            setter  = list;
            this.context = context;
        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return setter.size() != 0 ? setter.size() : 0;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return setter.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }        

        @Override
        public View getView(final int position,  View convertView, ViewGroup parent) {                                  
            Holder holder;
            if (convertView == null){
                holder = new Holder();
                convertView =   View.inflate(context, R.layout.item, null);
                holder.txtID = (TextView) convertView.findViewById(R.id.text);
                holder.txtName  =   (TextView) convertView.findViewById(R.id.text2);
                convertView.setTag(holder);
            }else{
                holder = (Holder) convertView.getTag();
            }          

            if ( pos == position ) {
                convertView.setBackgroundColor(Color.MAGENTA);
            }else{
                convertView.setBackgroundColor(Color.WHITE);                
            }           

            holder.txtID.setText(setter.get(position).getId());
            holder.txtName.setText(setter.get(position).getName());            

            convertView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {             
                    pos = position;                     
                    notifyDataSetChanged();
                 }
            });           
            return convertView;
        }      

    static class Holder{
        TextView txtID;
        TextView txtName;
    }
}