0

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

我正在尝试为此目的调整 ListView。假设我想展示一个包含 5 个选项的垂直列表:

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

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

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

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

可能的选项通过 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);

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

现在我需要插入第一项始终是红色的。我尝试在旧位置获取视图并赋予它一段时间的颜色,然后在新位置获取视图并赋予它红色,但没有成功。

任何想法?谢谢!

4

2 回答 2

1

我从来都不是在代码中设置文本颜色的忠实拥护者,但是您不能只覆盖适配器中的 getView() 方法,然后根据项目在列表中的位置,您可以在其上设置文本颜色吗?

IE:

    @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..
    }
于 2013-05-29T21:12:40.793 回答
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;
    }
}
于 2013-05-30T05:27:09.763 回答