2017-10-15 18 views
1

onClickを使わずにListViewの行を自動的に強調表示する必要があります。私のアプリがしていることは、食品の有効期限が90日を下回ったときに、特定の食品に警告(強調表示)することです。ソリューションのためにStack Overflowを検索しましたが、すべてのハイライトはonClickを使用して実装されています。私はListViewのonClick Highlightを実装しました。これは、食料品の有効期限が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

リスト項目の状態がlistviewの各項目のバックグラウンドにxmlセレクタを使用する必要があります。完全なコードスニペットは以下のとおりである -

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> 

listview項目の背景drwable/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> 

そして、あなたのアダプタのgetView() METHOD-であなたのlistviewlayout_listview_item.xmlを追加します

@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

おそらくあなたのアイテムオブジェクトは、有効期限を参照するフィールドを持っています(90日に達すると)、アダプタの(取得ビューの)メソッドでは、アイテムの配列内のすべてのアイテムオブジェクトのフィールドをチェックする必要がありますフィールドが90日未満に達したら、このアイテムの背景色を変更して強調表示します。

関連する問題