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.

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(); } } 

Función de búsqueda

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); 
  • GetBaseContext o getContext? ¿Cómo difieren?
  • Cómo cambiar el nombre de un proyecto en Android Studio
  • Serialice una matriz de ints para enviar usando KSOAP2
  • ¿Dónde está la carpeta lib de la aplicación de Android?
  • ¿Cómo puedo utilizar el mensaje de la nube Firebase en un proyecto eclipse?
  • ListView aleatorio IndexOutOfBoundsException en Froyo
  • Html Audio en la vista web de Android
  • Problemas al configurar un TCP Proxy transparente en Android / Linux
  • Cómo utilizar FirebaseInstanceId.getInstance (). DeleteInstanceId ()?
  • Android.provider.Settings.Secure.ANDROID_ID devuelve "android_id"
  • Android: cómo reproducir video mp4 desde la URL?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.