如何在没有onClick的情况下突出显示ListView中的行?

时间:2017-10-15 09:49:47

标签: android listview

我需要在没有onClick的情况下自动突出显示ListView中的一行。我的应用程序所做的是在食品到期日低于90天时对特定食品有警报(突出显示)。我搜索了Stack Overflow以获得解决方案,但所有亮点都是使用onClick实现的。我已经为我的ListView实现了onClick Highlight(这不是我想要的)有没有什么方法可以在食品有效期到达90天以下时自动实现突出显示?非常感谢任何帮助!

当我点击Milo产品时,会出现高亮显示,如何在90天以下到期的食品上自动显示突出显示

这是我的XML布局

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_above="@+id/AddProduct"
        android:id="@+id/listView2"
        android:layout_centerHorizontal="true"
        android:layout_alignParentTop="true"
        android:choiceMode="multipleChoice"
        android:listSelector="@drawable/Selector"
        />

我的Java文件

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_inventory);
    AddProduct = (Button) findViewById(R.id.AddProduct);
    camera = (ImageButton) findViewById(R.id.camera);
    AddProduct.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(Inventory.this, AddProduct.class));
        }
    });
    camera.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), BarcodeCaptureActivity.class);
            startActivityForResult(intent, BARCODE_READER_REQUEST_CODE);

        }
    });

    mList = (ListView) findViewById(R.id.listView2);
    arrayAdapter = new ItemsAdapter(this, android.R.layout.simple_list_item_1, items);
    mList.setAdapter(arrayAdapter);
    database = FirebaseDatabase.getInstance().getReference("All Barcodes");
    final List<String> keys = new ArrayList<>(); // will contain list of keys corresponding to listview item
    database.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(final DataSnapshot dataSnapshot) {
            arrayAdapter.clear();
            for(final DataSnapshot snapshot : dataSnapshot.getChildren()){
                arrayAdapter.notifyDataSetChanged();

                Calendar c = Calendar.getInstance();
                SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                String dateNow = df.format(c.getTime());
                String exp = snapshot.child("expiration").getValue().toString();
                String barcode = snapshot.child("barcode").getValue().toString();
                String name = snapshot.child("pname").getValue().toString();
                String q =  snapshot.child("quantity").getValue().toString();

                Date d1 = null;
                Date d2 = null;
                try{
                    d1 = df.parse(exp);
                    d2 = df.parse(dateNow);
                }
                catch(Exception e){
                }

                long diff =  d1.getTime() - d2.getTime();
                long hours = diff/(60*60*1000);
                long days = hours/24;

                if (days<=90){
                    NotificationGenerator.openActivityNotification(getApplicationContext(),barcode, name, days);
                    Log.i( "Item expring in: " , days + " days");
                    Log.i("Item's barcode is " , barcode);



                }
                else{
                    Log.i("Item expring in: " , days + " days");
                }

                String value = (String) snapshot.child("expiration").getValue();

                items eachItem = new items(name,value.toString(),Long.toString(days),q);

                arrayAdapter.add(eachItem);

                keys.add(snapshot.getKey());


            }
            arrayAdapter.notifyDataSetChanged();

            mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, final int i, long l) {

                    view.setSelected(true);
                    String myKey = keys.get(i);
                    Intent intent  = new Intent(Inventory.this,Edit.class);
                   intent.putExtra("value",myKey);
                   startActivity(intent);
                }
            });
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

我的ListView适配器

public class ItemsAdapter extends ArrayAdapter<items> {
private ArrayList<items> itemObjects;

public ItemsAdapter(Context context, int textViewResourceId, ArrayList<items> itemObjects) {
    super(context, textViewResourceId, itemObjects);
    this.itemObjects = itemObjects;
}

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

    View v = convertView;

    // first check to see if the view is null. if so, we have to inflate it.
    // to inflate it basically means to render, or show, the view.

    if (v == null) {

        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //inflating the tex views from list_items.xml
        v = inflater.inflate(R.layout.list_items, null);
    }

    /*
     * Recall that the variable position is sent in as an argument to this method.
     * The variable simply refers to the position of the current object in the list. (The ArrayAdapter
     * iterates through the list we sent it)
     *
     * Therefore, i refers to the current Item object.
     */
    items i = itemObjects.get(position);

    //If i is not null
    if (i != null) {

        // obtaining a reference to the TextViews.
        // These TextViews are created in the XML files we defined.
        TextView ProdName = (TextView) v.findViewById(R.id.ProductName);
        TextView ProdNameValue = (TextView) v.findViewById(R.id.ProductNameData);
        TextView ExpiryDate = (TextView) v.findViewById(R.id.ExpiryDate);
        TextView ExpiryDateData = (TextView) v.findViewById(R.id.ExpiryDateData);
        TextView ExpiryIn = (TextView) v.findViewById(R.id.ExpiryIn);
        TextView ExpiryInData = (TextView) v.findViewById(R.id.ExpiryInData);
        TextView BarCode = (TextView) v.findViewById(R.id.BarCode);
        TextView BarCodeData = (TextView) v.findViewById(R.id.BarCodeData);

        // check to see if each individual text view is null.
        // if text view is not null (means containing the reference) , it will assign text/value!
        if (ProdName != null){
            ProdName.setText("Name: ");
        }
        if (ProdNameValue != null){
            ProdNameValue.setText(i.getName());
        }
        if (ExpiryDate != null){
            ExpiryDate.setText("Expiry Date: ");
        }
        if (ExpiryDateData != null){
            ExpiryDateData.setText(i.getValue());
        }
        if (ExpiryIn != null){
            ExpiryIn.setText("Expiry In (Days): ");
        }
        if (ExpiryInData != null){
            ExpiryInData.setText(i.getDays());
        }
        if (BarCode != null){
            BarCode.setText("Quantity: ");
        }
        if (BarCodeData != null){
            BarCodeData.setText(i.getQuantity());
        }
    }

    // the view must be returned to our activity
    return v;

}

3 个答案:

答案 0 :(得分:0)

当你添加有效期限时,你应该在适配器中执行此操作检查是否超过90天,然后给出你想要的颜色。

答案 1 :(得分:0)

您应该使用xml选择器为listview的每个项目添加列表项状态。完整的代码片段如下 -

ListView项目layout/layout_listview_item.xml的布局 -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:background="@drawable/listview_item_bg">
        <TextView       android:id="@+id/textForList"
        android:layout_height="fill_parent"
        android:layout_width="wrap_content"
        android:padding="10sp"  />
.
.
.
</LinearLayout>

listviewdrwable/listview_item_bg.xml的背景 -

    <selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="true">
    <shape>
        <solid android:color="#66FFFFFF" />
    </shape>
</item>
    <item>
    <shape>
        <solid android:color="#FF666666" />
    </shape>
</item>

</selector>

layout_listview_item.xml添加到适配器listview方法的getView() -

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

        View v = convertView;

        // first check to see if the view is null. if so, we have to inflate it.
        // to inflate it basically means to render, or show, the view.

        if (v == null) {

            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            //inflating the tex views from list_items.xml
            v = inflater.inflate(R.layout.layout_listview_item, null);
        }

.
.
.
.
.

    }

答案 2 :(得分:0)

可能你的item对象有一个字段引用截止日期(如果达到90天以下),所以在你的适配器中的(get view)方法中你需要检查你的项目数组中每个项目对象中的那个字段字段达到90天以下然后更改此项目列表的背景颜色,以便突出显示。