2017-10-15 66 views
1

我需要在ListView中自動突出顯示一行,而不需要onClick。我的應用程序所做的是在食品過期日期低於90天時對特定食品項目提醒(突出顯示)。我已經搜索堆棧溢出的解決方案,但所有的亮點都使用onClick實現。我已經爲我的ListView實現了onClick突出顯示(這不是我想要的),當食品項目到期日達到90天以下時,突出顯示可以自動實現嗎?任何幫助將不勝感激!如何在沒有onClick的情況下突出顯示ListView中的行?

當我點擊了產品米洛的亮點會出現,如何使亮點進行的,下面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; 

} 

回答

0

當您添加到期日檢查如果是則超過90天給你想要的顏色你應該這樣做的適配器。

0

您應該使用xml選擇器爲後臺的每個項目listview列出項目狀態。完整的代碼片段給出如下 -

<?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> 

背景爲listview項目drwable/listview_item_bg.xml - -

佈局ListView項目layout/layout_listview_item.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.xmllistview上您的適配器的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); 
     } 

. 
. 
. 
. 
. 

    } 
0

可能你的item對象有一個字段引用了到期日期(如果達到90天以下),那麼在你的適配器的(get view)方法中,你需要檢查項目數組中每個item對象中的字段,如果這字段達到90天以下,然後更改此項目列表的背景顏色,以使其突出顯示。

相關問題