当前位置: 首页 > 面试题库 >

Android ListActivity基于对象状态的行颜色

邓元白
2023-03-14
问题内容

我有一个ListActivity显示列表中的一堆对象。我想根据MonitorObject中两个布尔值的状态更改行的背景和文本颜色。

我是否需要扩展ArrayAdapter?如果是这样的话,代码示例将不胜感激,因为我已经尝试了几天,但没有成功。

public class Lwm extends ListActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list);
    setListAdapter(new ArrayAdapter<MonitorObject>(this, R.layout.row, getMonitorObjects()));
  }

  private List<MonitorObject> getMonitorObjects() {
    List<MonitorObject> mos = new ArrayList<MonitorObject>();
    mos.add(new MonitorObject(15000, 20000, 25000));
    mos.add(new MonitorObject(15000, 14000, 18000));
    mos.add(new MonitorObject(15000, 12000, 14000));
    mos.add(new MonitorObject(100, 200, 250));
    mos.add(new MonitorObject(3000, 2500, 3500));
    return mos;
  }
}
public class MonitorObject {
  private int mTimeTotal;
  private int mWarningThreshold;
  private int mAlarmThreshold;`enter code here`
  private boolean mWarning;
  private boolean mAlarm;

  public MonitorObject(int timeTotal, int warningThreshold, int alarmThreshold) {
    this.mTimeTotal = timeTotal;
    this.mWarningThreshold = warningThreshold;
    this.mAlarmThreshold = alarmThreshold;  
    mWarning = (mTimeTotal > mWarningThreshold) ? true : false;
    mAlarm = (mTimeTotal > mAlarmThreshold) ? true : false;
  }
  /*getters, setters, tostring goes here*/
}

问题答案:

我在commonsware.com的“ Android开发的繁忙编码员指南”的免费摘录中找到了有关如何执行此操作的出色教程。还可以在youtube
上查看Google I / O
2010-ListView的世界
,其中包含许多有用的信息。

基本上,我要做的只是创建一个自定义ArrayAdapter并覆盖getView()。查看下面的代码。

public class Lwm extends ListActivity {
  private TextView mSelection;
  private List<MonitorObject> mMonitorObjects;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mMonitorObjects = getMonitorObjects();
    setContentView(R.layout.main);
    setListAdapter(new CustomAdapter());
    mSelection = (TextView)findViewById(R.id.selection);
  }

  @Override
  public void onListItemClick(ListView parent, View v, int position, long id){
    mSelection.setText("Selection length is: " + mMonitorObjects.get(position).toString().length());
  }

  private class CustomAdapter extends ArrayAdapter<MonitorObject> {
    CustomAdapter() {
      super(Lwm.this, R.layout.row, R.id.label, mMonitorObjects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {     
      View row = convertView;

      if (row == null) {
        // This gives us a View object back which, in reality, is our LinearLayout with 
        // an ImageView and a TextView, just as R.layout.row specifies.
        LayoutInflater inflater = getLayoutInflater();      
        row = inflater.inflate(R.layout.row, parent, false);
      }

      TextView label = (TextView) row.findViewById(R.id.label);
      label.setText(mMonitorObjects.get(position).toString());
      ImageView icon = (ImageView)row.findViewById(R.id.icon);

      MonitorObject mo = getMonitorObjects().get(position);

      if (mo.ismAlarm()) {
        icon.setImageResource(R.drawable.alarm);
        row.setBackgroundColor(Color.RED);
      } else if (mo.ismWarning()){
        icon.setImageResource(R.drawable.warning);
        row.setBackgroundColor(Color.YELLOW);
      } else {
        icon.setImageResource(R.drawable.ok);
        row.setBackgroundColor(Color.GREEN);
      }

      return row;       
    }
  }

  private List<MonitorObject> getMonitorObjects() {
    List<MonitorObject> mos = new ArrayList<MonitorObject>();
    mos.add(new MonitorObject(15000, 20000, 25000));
    mos.add(new MonitorObject(15000, 14000, 18000));
    mos.add(new MonitorObject(15000, 12000, 14000));
    mos.add(new MonitorObject(100, 200, 250));
    mos.add(new MonitorObject(3000, 2500, 3500));
    return mos;
  }
}


 类似资料:
  • 我有一个组件,它作为一个道具发送一个方法来改变表单的输入值(像任何基本表单一样)。在onChange开始工作后,我决定添加一个clear按钮来一次清除所有输入值,因此我创建了一个方法来清除所有输入。 示例: 像上面的方法那样清除会产生一个错误,因为我要移除state中的键,而表单输入的值是针对state的。没问题,所以我想,我只需要将setState中的所有输入添加到一个空字符串,如:which

  • 根据Googles材料指南: https://material.io/guidelines/components/text-fields.html#text-fields-layout TextInputLayout提示应该与错误消息的颜色相同: 我如何更改此行为以适应Google自己的指导方针?

  • 在下面的示例中,我希望组件在列表更新时重新渲染。但是即使连接传递了新状态,它也不会重新呈现组件。 我知道connect执行浅层比较,但不知道如何使其比较对象的值。我找不到任何启用选项的连接示例。 我已经了解了redux连接的组件如何知道何时重新渲染?还有一些,但也没用。 我试过了 只是试图让它重新渲染任何变化。这似乎也不起作用。 输出

  • 我在JS对象(不是数组)中有一个

  • 问题内容: 我正在尝试将状态栏的颜色更改为蓝色或其他某种颜色。 这可能吗,或者Apple不允许吗? 问题答案: 注意:此解决方案在iOS 13及更高版本下失败。 Plist中的第一个设置为 输出屏幕截图如下

  • 2d_canvas String - 画布. flash_3d String - Flash. flash_stage3d String - Flash 舞台3D. flash_stage3d_baseline String - Flash 舞台3D 基线配置. gpu_compositing String - 合成. multiple_raster_threads String - 多光栅线程.