Spanish [SOLUCIONADO] Como conseguir funcionalidad del control Searchview en ACSearchview

Miguelito

Member
Licensed User
Buenos días a todos, no se como programar la funcionalidad ACSearchview, quiero conseguir el mismo resultado de este codigo, no se si será posible, muchas gracias por sus respuestas:

B4X:
Sub Process_Globals
    Dim index As Object
End Sub

Sub Globals
    Dim sv As SearchView
End Sub

Sub Activity_Create(FirstTime As Boolean)
    sv.Initialize(Me, "sv")
    sv.AddToParent(Activity, 0, 0, 200dip, 300dip)
   
    If FirstTime Then
        Dim cities As List
        cities = File.ReadList(File.DirAssets, "Cities.txt")
        'As an optimization we store the index as a process global variable
        'and only build it once.
        index = sv.SetItems(cities)
    Else
        sv.SetIndex(index)
    End If
End Sub

Sub sv_ItemClick(Value As String)
    Msgbox("Chosen value: " & Value, "")
End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User

Miguelito

Member
Licensed User
Hola bgsoft, lo que quiero decir es que estoy utilizando la librería ACSearchview, esta no tiene el método sv.SetItems para listar los nombres de las palabras a buscar como si lo tiene la librería Searchview.

upload_2016-11-9_9-7-20.png


Quiero desarrollar esta funcionalidad con la librería ACSearchview. Gracias por la respuesta.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Quiero desarrollar esta funcionalidad con la librería ACSearchview. Gracias por la respuesta.
Perdona mi ignorancia, pero la verdad que no tengo esa libreria (ACSearchview), y si la busco, al menos yo, no la encuentro, asi que me resulta dificil poder ayudarte, dime de donde la bajaste e intentaré ayudarte.

Saludos
 

Miguelito

Member
Licensed User
Se encuentra en este ejemplo https://www.b4x.com/android/forum/t...compatible-with-older-android-versions.48423/

upload_2016-11-9_12-48-59.png


Este es el codigo:

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Private sv As ACSearchView
    Private si As ACMenuItem
End Sub

'This is the Sub called by the inline Java code to initialize the Menu
Sub Activity_CreateMenu(Menu As ACMenu)
    sv.Initialize2("Search", sv.THEME_DARK)
    sv.IconifiedByDefault = True

    'Clear the menu
    Menu.Clear
   
    'Add a menu item and assign the SearchView to it
    si = Menu.Add2(1, 1, "Search", Null)
    si.SearchView = sv
End Sub

'If the user submits a search then this event sub is called
Sub Search_QuerySubmitted (Query As String)

    sv.Iconfied = True
    si.ItemCollapsed = True
   
    Log("Search for '" & Query & "'")
End Sub

Sub Search_Closed
    Log("SearchView closed")
End Sub

Sub Search_QueryChanged (Query As String)
    Log("Query changed: " & Query)
End Sub
 

Attachments

  • upload_2016-11-9_12-48-33.png
    upload_2016-11-9_12-48-33.png
    40.4 KB · Views: 216

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

Como decia Jack el destripador: "Vayamos por partes" :D

Quiero desarrollar esta funcionalidad con la librería ACSearchview. Gracias por la respuesta.
La libreria ACSearchview no existe, esa función está dentro de la libreria AppCompat, que se emplea para crear las App con la filosofia Material Design, si tienes dudas sobre ese respecto, nuestro compañero Rscheel ha realizado un magnífico tutorial en este foro:
https://www.b4x.com/android/forum/t...-actualizado-appcompact-v3-30-y-b4a-v6.61768/ .
Y si te surgen dudas puedes consultar directamente en el tutorial.

Me has marcado el botón "search" en rojo, o sea, lo que quieres es que cuando le des a ese botón hagas lo que hace el codigo de clase Searchview, pues simplemente en el evento crea lo mismo, o sea, añade el modulo de clase e implementalo en tu busqueda.

Un Ejemplo rápido:
B4X:
Sub Globals
' añade estas dos lineas
Dim sv2 As SearchView ' **** importante que sea otro nombre ya que en el ejemplo existe ese nombre ********
Dim index As Object


Sub Activity_Create(FirstTime As Boolean)
   'Do not forget to load the layout file created with the visual designer. For example:
   Activity.LoadLayout("layout1")

   '*** COMENTO TODAS ESAS LINEAS PARA APROVECHAR TU CODIGO Y QUE SOLO SE VEA LO QUE TU QUIERES ***
   'ScrollView1.Panel.LoadLayout("lay_scrollview")
   'ScrollView1.Panel.Height = Panel6.Top + Panel6.Height + 8dip

   'ACSpinner1.AddAll(Array As String ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"))
   'ACSpinner2.AddAll(Array As String ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"))

   'Ad some Action Menu items
   'ACActionMenu1.Menu.Add(1, 1, "Menu1", Null)
   'ACSubmenu1 = ACActionMenu1.Menu.AddSubMenu(1, 2, 2, "Submenu")
   'ACSubmenu1.Add(101, 1, "Submenu Item 1", Null)
   'ACSubmenu1.Add(102, 2, "Submenu Item 2", Null)
   'ACActionMenu1.Menu.Add(3, 3, "MenuItem 2", Null)

   ' ********* añadimos el mismo código del ejemplo de Searchview **************
   sv2.Initialize(Me, "sv")
   sv2.AddToParent(Activity, 0, 0, 200dip, 300dip)

   If FirstTime Then
     Dim cities As List
     cities = File.ReadList(File.DirAssets, "Cities.txt")
     'As an optimization we store the index as a process global variable
     'and only build it once.
     index = sv2.SetItems(cities)
   Else
     sv2.SetIndex(index)
   End If
    
End Sub

Sub Search_QueryChanged (Query As String)
  sv2.et_TextChanged(Query,Query)  ' ******* añade este código al evento **********
   Log("Query changed: " & Query)
End Sub
Añade el fichero Cities.txt
Añade el Código de clase Searchview.bas


Cosas a hacer en el codigo de clase Searchview.bas
B4X:
Public Sub Initialize (Callback As Object, EventName As String)
   et.Initialize("et")
   'Remove the suggestions bar
   et.InputType = Bit.Or(et.INPUT_TYPE_TEXT, 0x00080000)
   lv.Initialize("lv")
   lv.SingleLineLayout.ItemHeight = 50dip
   lv.SingleLineLayout.Label.TextSize = 14
  
   ' ******* añadir estas dos lineas, pon los colores que quieras *******
   lv.SingleLineLayout.Label.TextColor = Colors.White 
   lv.SingleLineLayout.Label.Color = Colors.Blue

  
   lv.Visible = False
   prefixList.Initialize
   substringList.Initialize
   mCallback = Callback
   mEventName = EventName
End Sub

' ********** Hacer Público este sub (era private) *********
Public Sub et_TextChanged (Old As String, New As String)

   lv.Clear
   If lv.Visible = False Then lv.Visible = True
   If New.Length < MIN_LIMIT Then Return
   Dim str1, str2 As String
   str1 = New.ToLowerCase
   If str1.Length > MAX_LIMIT Then
     str2 = str1.SubString2(0, MAX_LIMIT)
   Else
     str2 = str1
   End If
   AddItemsToList(prefixList.Get(str2), str1)
   AddItemsToList(substringList.Get(str2), str1)
End Sub

Y con esto ya tienes lo que querias ;), lo he probado y funciona. Ahora eres tu quien decide donde ponerlo (top,left), los tamaños del List y que otros objetos le añades.


Feliz fin de semana a todos

Saludos
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Y de regalo para que no te molestes en escribir, el código de mi prueba ;) (lo he probado en Android 6x)
Esto mínimo un café :D



Saludos
 

Attachments

  • AppCompatBase2.zip
    16.2 KB · Views: 246
  • Screenshot_20161111-113136.png
    Screenshot_20161111-113136.png
    55 KB · Views: 327
  • Screenshot_20161111-113413.png
    Screenshot_20161111-113413.png
    53.7 KB · Views: 300

Miguelito

Member
Licensed User
Se agradece la ayuda @bgsoft, funciona a la perfección , disculpa mi ignorancia en algunas preguntas recien llevo un mes con el programa, lo que has hecho me ayuda bastante en lo que quiero hacer, claro cuando quieras un cafecito como mínimo estoy en Lima-Perú.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Se agradece la ayuda @bgsoft, funciona a la perfección , disculpa mi ignorancia en algunas preguntas recien llevo un mes con el programa, lo que has hecho me ayuda bastante en lo que quiero hacer, claro cuando quieras un cafecito como mínimo estoy en Lima-Perú.

No te preocupes por las preguntas, nadie nace enseñado, y aqui estamos para ayudarnos unos a otros, lo del café cuidado que tengo amigos peruanos que quieren que vaya, aunque estan algo lejos de Lima , uno en Piura y otra en Cusco, pero una vez cruzado el charco... igual te lo cambio por un ceviche de langostinos :D

Saludos
 

b4xscripter

Member
Licensed User
Longtime User
Hola,
Antes de nada, muchas gracias por esta gran solución!
No quería empezar un nuevo thread porque no quiero sacar del contexto mi pregunta.
Sería posible colocar el valor seleccionado de la lista predictiva directamente en el input de search?
Por ejemplo, estoy buscando Madrid, escribo "Mad" y tengo 4 opciones. Al seleccionar finalmente Madrid, tiene sentido copiar esta seleccion directamente al input de search.
Yo creo que sería muy útil!

O sea:
B4X:
Sub sv_ItemClick(Value As String)
    sv.Query = Value
    Msgbox("Chosen value: " & Value, "")
End Sub
Gracias,

Saludos cordiales
 
Top