Función de búsqueda en GridView Android
Espero que alguien pueda ayudarme. He estado siguiendo este tutorial de búsqueda de Android Filtro ListView imágenes y textos Tutorial con éxito. Estoy tratando de implementarlo en mi propia actividad y obtener datos del servidor.
Cuando estoy escribiendo dentro del campo de búsqueda, la vista de cuadrícula se vuelve vacía. Su como la lista en el adaptador de encargo se convierte en nulo.
- Objeto no se puede emitir a Void en AsyncTask
- JNI en Android: ¿Cómo recuperar una cadena de código Java?
- Añadiendo el proyecto android a git
- RelativeLayout no se puede convertir en android.support.v7.widget.Toolbar
- Cómo detener HttpURLConnection.getInputStream ()?
Mi clase de actividad
package com.danz.tensai.catalog; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.GridView; import android.widget.ProgressBar; import android.widget.Toast; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonArrayRequest; import com.danz.tensai.catalog.app.MyApplication; import com.danz.tensai.catalog.helper.Product; import com.danz.tensai.catalog.helper.SwipeListAdapter; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class MainActivity extends ActionBarActivity { private String TAG = MainActivity.class.getSimpleName(); private String URL_TOP_250 = "http://danztensai.hostoi.com/imdb_top_250.php?offset="; private SwipeRefreshLayout swipeRefreshLayout; //private ListView listView; private GridView gridView; private SwipeListAdapter adapter; private List<Product> productList; private ProgressBar spinner; EditText editsearch; private int offSet = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gridView = (GridView)findViewById(R.id.gridViewListProduct); productList = new ArrayList<>(); fetchProduct(); adapter = new SwipeListAdapter(this, productList); gridView.setAdapter(adapter); editsearch = (EditText)findViewById(R.id.search); editsearch.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub String text = editsearch.getText().toString().toLowerCase(Locale.getDefault()); Log.d(TAG,"Text To Search : "+text); adapter.filter(text); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private void fetchProduct() { spinner = (ProgressBar)findViewById(R.id.progressBar1); // appending offset to url String url = URL_TOP_250 + offSet; // Volley's json array request object JsonArrayRequest req = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { Log.d(TAG, response.toString()); if (response.length() > 0) { // looping through json and adding to movies list for (int i = 0; i < response.length(); i++) { try { JSONObject movieObj = response.getJSONObject(i); int rank = movieObj.getInt("rank"); String title = movieObj.getString("title"); String imageURL = movieObj.getString("imageURL"); Product m = new Product(rank, title,imageURL); productList.add(0, m); // updating offset value to highest value if (rank >= offSet) offSet = rank; } catch (JSONException e) { Log.e(TAG, "JSON Parsing error: " + e.getMessage()); } } // adapter.notifyDataSetChanged(); } // stopping swipe refresh // swipeRefreshLayout.setRefreshing(false); spinner.setVisibility(View.GONE); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, "Server Error: " + error.getMessage()); Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); // stopping swipe refresh // swipeRefreshLayout.setRefreshing(false); spinner.setVisibility(View.GONE); } }); // Adding request to request queue Log.e(TAG,req.toString() ); MyApplication.getInstance().addToRequestQueue(req); } }
Y mi adaptador personalizado
public class SwipeListAdapter extends BaseAdapter { private Activity activity; LayoutInflater inflater; Context mContext; private List<Product> productList; private ArrayList<Product> arraylist; private String TAG = SwipeListAdapter.class.getSimpleName(); //private String[] bgColors; public SwipeListAdapter(Context context, List<Product> productList) { //this.activity = activity; mContext = context; this.productList = productList; inflater = LayoutInflater.from(mContext); this.arraylist = new ArrayList<Product>(); this.arraylist.addAll(productList); // bgColors = activity.getApplicationContext().getResources().getStringArray(R.array.movie_serial_bg); } public class ViewHolder{ ImageView productImage; } @Override public int getCount() { return productList.size(); } @Override public Object getItem(int location) { return productList.get(location); } @Override public long getItemId(int position) { return position; } public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if(convertView==null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.list_row,null); holder.productImage = (ImageView) convertView.findViewById(R.id.productImage); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } new DownloadImageTask((holder.productImage)) .execute(productList.get(position).imageURL); return convertView; } public void filter(String charText) { charText = charText.toLowerCase(Locale.getDefault()); productList.clear(); if (charText.length() == 0) { productList.addAll(arraylist); } else { for (Product wp : arraylist) { if (wp.getTitle().toLowerCase(Locale.getDefault()) .contains(charText)) { productList.add(wp); } } } notifyDataSetChanged(); } }
- Buena ingeniería de software vs. seguridad
- Desmarcando archivos XML en objetos Java en Android?
- El signo de interrogación me parece nuevo
- ¿Loop a través de todos los childs de GroupView?
- RingtoneManager que vuelve el tono null
- Icono de elemento del cajón de navegación que no muestra el color original
- ArrayList Adapter (para ListView) sólo muestra el primer elemento agregado
- Cómo cambiar la línea de fondo de EditText mediante programación
Cuando está creando el adaptador, en su constructor, agrega a la lista arraylist
el contenido de productList
. En ese punto (el constructor del adaptador) la lista de productList
es más probable vacío como la solicitud http para buscar el json no ha terminado todavía. Así que terminas con un arraylist vacío y cuando haces cualquier filtrado en el adaptador no verás nada porque no hay nada que filtrar.
No olvide actualizar el arraylist (desde el adaptador) cuando los datos finalmente llegan en la devolución de llamada onResponse () para que tenga una referencia a ella para usarla para filtrar.
Le aconsejo que siga otros tutoriales.
Editar:
Agregue un método "add" al adaptador para insertar los nuevos elementos:
//In the SwipeListAdapter class add public void add(Product p) { productList.add(0, p); arraylist.add(0, p); notifyDataSetChyanged(); }
Entonces en su actividad, en lugar de:
productList.add(0, m);
llamada:
adapter.add(m);