如果某个条件为真,则更改列表视图中的行颜色?

时间:2016-05-26 12:29:46

标签: java android listview android-arrayadapter

我希望根据某个条件为true来突出显示列表视图中的某一行。我尝试了以下代码,并获得了空指针异常。

public class BillsCustomList extends ArrayAdapter<String>
{
    private String[] doc_no;
    private String[]date;
    private String[] cust_name;
    private String[] cust_number;
    private String[] item_count;
    private String[]total_wt;
    private String[]total;
    private String[]balance;
    private String[]bill_type;
    private String[]status;

    private Activity context;

    public BillsCustomList(Activity context, String[] doc_no, String[] date, String[] cust_name,String[] cust_number,
                           String[] item_count,String[] total_wt,String[] total,String[] balance,String[] bill_type,String[] status)
    {
        super(context, R.layout.bills_list_view, doc_no);
        this.context =context;
        this.doc_no=doc_no;
        this.date = date;
        this.cust_name = cust_name;
        this.cust_number = cust_number;
        this.item_count= item_count;
        this.total_wt = total_wt;
        this.total = total;
        this.balance = balance;
        this.bill_type = bill_type;
        this.status = status;

    }

    @Override
    public View getView(int position, View listViewItem, ViewGroup parent)
    {
        if (null == listViewItem) {
            LayoutInflater inflater = context.getLayoutInflater();
            listViewItem = inflater.inflate(R.layout.bills_list_view, null, true);
        }
        TextView textViewDocno = (TextView) listViewItem.findViewById(R.id.textViewInvNo);
        TextView textViewDt = (TextView) listViewItem.findViewById(R.id.textViewDt);
        TextView textViewName = (TextView) listViewItem.findViewById(R.id.textViewName);
        TextView textViewNumber = (TextView) listViewItem.findViewById(R.id.textViewNumber);
        TextView textViewCount = (TextView) listViewItem.findViewById(R.id.textViewCount);
        TextView textViewTotwt = (TextView) listViewItem.findViewById(R.id.textViewTotwt);
        TextView textViewTot = (TextView) listViewItem.findViewById(R.id.textViewTot);
        TextView textViewBal = (TextView) listViewItem.findViewById(R.id.textViewBalanace);
        TextView textViewBt = (TextView) listViewItem.findViewById(R.id.textViewBt);
        TextView textViewStatus = (TextView) listViewItem.findViewById(R.id.textView_status);
        LinearLayout ll = (LinearLayout) listViewItem.findViewById(R.id.ll_bills);

        textViewDocno.setText(doc_no[position]);
        textViewDt.setText(date[position]);
        textViewName.setText(cust_name[position]);
        textViewNumber.setText(cust_number[position]);
        textViewCount.setText(item_count[position]);
        textViewTotwt.setText(total_wt[position]);
        textViewTot.setText(total[position]);
        textViewBal.setText(balance[position]);
        textViewBt.setText(bill_type[position]);
        textViewStatus.setText(status[position]);

        try
        {
            if (textViewStatus.getText().toString().equalsIgnoreCase("true"))
            {
                ll.setBackgroundColor(Color.RED);

            }

        }catch (NullPointerException e)
        {
            Log.d("NULL ERROR", "position"+position+e);
        }




        return listViewItem;
    }


}
  

我有简单的用例,如果状态为true则使某一行成行   color.Else什么都不做。我试试的时候出现以下错误   上面的代码。

     

NULL错误:position0java.lang.NullPointerException:尝试调用   虚方法'布尔值   空对象上的java.lang.String.equalsIgnoreCase(java.lang.String)'   参考

我在0和1位置得到这些空指针异常。任何人都可以解释为什么会发生这种情况以及执行此操作的正确方法。 欢迎任何帮助或建议。谢谢。

3 个答案:

答案 0 :(得分:1)

对于某些职位,可能是gettign status[position] null,以避免更改代码,如下所示

if(textViewStatus.getText()!=null){

     if (textViewStatus.getText().toString().equalsIgnoreCase("true"))
     {
        ll.setBackgroundColor(Color.RED);

     }else{
        ll.setBackgroundColor("Different color");
     }
}else{
      ll.setBackgroundColor("Different color");
}

答案 1 :(得分:1)

@mdDroid已经回答了问题,但还有一些其他标准方法来检查空字符串。

  

TextUtils.isEmpty(CharSequence str) -         如果字符串为null或0-length,则返回true。

if (!TextUtils.isEmpty(textViewStatus.getText()) && textViewStatus.getText().toString().equalsIgnoreCase("true"))
    ll.setBackgroundColor(Color.RED);
else
    ll.setBackgroundResource(android.R.color.transparent);

通过编写如下条件

来避免 NPE for strings 的最佳方法
 if ("true".equalsIgnoreCase(textViewStatus.getText().toString()))
     ll.setBackgroundColor(Color.RED);
 else
     ll.setBackgroundResource(android.R.color.transparent);

答案 2 :(得分:0)

你应该在背景改变之前检查数组上的数组位置:

if (position < status.length() && status[position].equalsIgnoreCase("true"))
    ll.setBackgroundColor(Color.RED);
else
    ll.setBackgroundResource(android.R.color.transparent);

我希望所有数组都具有相同的长度,否则ArrayAdapter逻辑无法正常工作