【问题标题】:Reload data after search on json listview android在json listview android上搜索后重新加载数据
【发布时间】:2018-11-29 22:11:57
【问题描述】:

我已经搜索了整个 StackOverflow 试图解决我的问题,但我似乎无法让我的过滤器工作。 我正在使用 edittext 过滤我的 json listview,它使用 volley 填充, 我希望能够搜索我的“titulo”或“dificuldade”,如果我删除 EditText,我想从列表视图重新加载数据。

以下是我目前尝试过的。

我的适配器类:

public class AdapterTrilhos extends BaseAdapter implements Filterable {
private final Activity activity;
private List<String>originalData = null;
private LayoutInflater inflater;
private List<Trilhos> triList;
private ItemFilter mFilter = new ItemFilter();
private List<Trilhos> originalTrilhosList;


public AdapterTrilhos(List<Trilhos> triList, Activity activity) {
    this.activity = activity;
    this.triList = triList;

    this.originalTrilhosList = new ArrayList<Trilhos>(triList);
}
//Add Below Method
public void reloadData(){
    this.originalTrilhosList = new ArrayList<Trilhos>(triList);
    notifyDataSetChanged();
}

@Override
public int getCount() {
    return this.triList.size();
}

@Override
public Object getItem(int position) {
    return this.triList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {


    if (inflater == null)
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null)

        convertView = inflater.inflate(R.layout.dadoslista, null);

    TextView idtxt = (TextView) convertView.findViewById(R.id.txtid);

    TextView tittxt = (TextView) convertView.findViewById(R.id.txttit);

    // TextView usertxt = convertView.findViewById(R.id.txtuser);

    TextView diftxt = (TextView) convertView.findViewById(R.id.txtdif);
    RatingBar ratess = (RatingBar) convertView.findViewById(R.id.ratings);

    Trilhos t = triList.get(position);

    idtxt.setText(String.valueOf(t.getId()));
    tittxt.setText(t.getTitulo());
    //   usertxt.setText(String.valueOf(t.getId_user()));
    diftxt.setText(t.getDificuldade());
    ratess.setRating(t.getMedia());

    return convertView;
}
public Filter getFilter() {
    return mFilter;
}

private class ItemFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        String filterString = constraint.toString().toLowerCase();

        FilterResults results = new FilterResults();


        //results.values = nlist;
        //results.count = nlist.size();
        results.values = originalTrilhosList;
        results.count = originalTrilhosList.size();

        return results;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        //filteredData = (ArrayList<String>) results.values;
        //movieItems = (ArrayList<Movie>) results.values;
        triList.clear();
        triList.addAll((ArrayList<Trilhos>) results.values);
        notifyDataSetChanged();
    }

}

这是我的 ListarTrilhos 类,我在其中填充了我的列表视图并尝试使用编辑文本进行过滤。

private ListView listView;
private AdapterTrilhos adapter;
SharedPreferences dados, n_trilho;
private List<Trilhos> TrilhosList = new ArrayList<Trilhos>();
private List<Trilhos> originalTrilhos= new ArrayList<Trilhos>();

这是搜索:

search.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int start, int before, int count) {
            // TODO Auto-generated method stub
            // When user changed the Text

            String filterString = cs.toString().toLowerCase();
            Log.e("TAG", "filterString:" + filterString);
            TrilhosList.clear();
            if (TextUtils.isEmpty(filterString)) {
                TrilhosList.addAll(originalTrilhos);
            }

            String filterableString;
            for (Trilhos tril : originalTrilhos) {

                //search from the title field
                if (tril.getTitulo().toLowerCase().contains(filterString)) {
                    TrilhosList.add(tril);
                }
                //search from the year field
                else if (String.valueOf(tril.getDificuldade()).toLowerCase().contains(filterString))
                {
                    TrilhosList.add(tril);
                }

            }
            adapter.notifyDataSetChanged();
            //FLAGS Cannot resolve method 'getFilter()' here


        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            //    String text = search.getText().toString().toLowerCase(Locale.getDefault());
            //     adapter.filter(text);

        }
    });
    criarLista();

最后我使用 volley 填充我的列表

public void criarLista() {
    RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext());
    JsonArrayRequest request = new JsonArrayRequest(
            urlget,
            new Response.Listener<JSONArray>() {

                @Override
                public void onResponse(JSONArray response) {
                    int count = response.length();
                    for (int i = 0; i < count; i++) {
                        try {

                            JSONObject jo = response.getJSONObject(i);
                            Trilhos tri = new Trilhos();
                            tri.setId(jo.getInt("id"));
                            tri.setTitulo(jo.getString("titulo"));
                            tri.setId_user(jo.getInt("id_user"));
                            tri.setDificuldade(jo.getString("dificuldade"));
                            float test = BigDecimal.valueOf(jo.getDouble("media")).floatValue();
                            tri.setMedia(test);
                            TrilhosList.add(tri);


                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }


                    }

                    //  Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show();
                    adapter.notifyDataSetChanged();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getApplicationContext(), "onErrorResponse", Toast.LENGTH_LONG).show();
                }
            }
    );
    Object TAG_REQUEST_QUEUE = new Object();
    request.setTag(TAG_REQUEST_QUEUE);
    mRequestQueue.add(request);
    mRequestQueue.start();
}

列表视图加载完美,但在我的编辑文本中插入任何内容后,它只是变为空白,

感谢您的帮助

【问题讨论】:

    标签: android listview arraylist adapter


    【解决方案1】:

    尝试使用文本观察类。你可以查看文档https://developer.android.com/reference/android/text/TextWatcher

    【讨论】:

      【解决方案2】:

      我通过将所有列表更改为数组列表来解决问题!我会留下我的答案,以防万一有人需要,它工作得很好!

      在我的主目录

      search.addTextChangedListener(new TextWatcher() {
      
              @Override
              public void onTextChanged(CharSequence cs, int start, int before, int count) {
                  // TODO Auto-generated method stub
                  // When user changed the Text
                  adapter.getFilter().filter(cs.toString());
      
      
              }
      
              @Override
              public void beforeTextChanged(CharSequence s, int start, int count,
                                            int after) {
                  // TODO Auto-generated method stub
      
              }
      
              @Override
              public void afterTextChanged(Editable s) {
                  // TODO Auto-generated method stub
      
      
              }
          });
      

      在适配器上

       private ArrayList<Trilhos> triList;
      private ArrayList <Trilhos> mStringList;
      private ValueFilter valueFilter;
      
      public AdapterTrilhos(ArrayList<Trilhos> triList, Activity activity) {
          this.activity = activity;
          this.triList = triList;
      
          mStringList=triList;
          getFilter();
      }
      
      
      @Override
      public Filter getFilter() {
          if(valueFilter==null) {
      
              valueFilter=new ValueFilter();
          }
      
          return valueFilter;
      }
      private class ValueFilter extends Filter {
          @Override
          protected FilterResults performFiltering(CharSequence constraint) {
              FilterResults results = new FilterResults();
              if(constraint!=null && constraint.length()>0){
                  ArrayList<Trilhos> filterList= new ArrayList<Trilhos>();
                  for(int i=0; i<mStringList.size();i++){
                      if ((mStringList.get(i).getTitulo().toLowerCase()).contains(constraint.toString().toLowerCase())){
                          Trilhos trilhos = new Trilhos();
                          trilhos.setTitulo(mStringList.get(i).getTitulo());
                          filterList.add(trilhos);
                      }
                  }
                  results.count=filterList.size();
                  results.values=filterList;
              }else {
                  results.count=mStringList.size();
                  results.values=mStringList;
              }
              return results;
          }
      
          @SuppressWarnings("unchecked")
          @Override
          protected void publishResults(CharSequence constraint, FilterResults results) {
              triList=(ArrayList<Trilhos>) results.values;
              notifyDataSetChanged();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-10
        • 2014-05-18
        • 2018-09-20
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多