我需要在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;
}