如何使用volley JSON android实现SearchView?

如何使用volley JSON android实现SearchView?

问题描述:

我正在开发一个android项目,我必须在操作栏上实现搜索视图。我能够使用volley将JSON数据解析为回收站视图。当我尝试添加搜索视图并开始输入文本时,列表正在消失。如何使用volley JSON android实现SearchView?

活动:

public class Fragment_Church_News extends AppCompatActivity { 


    private static final String TAG = MainActivity.class.getSimpleName(); 
    private ListView listView; 
    Context con; 
    private ChurchNewsFeedListAdapter listAdapter; 
    private List<ChurchNewsFeedItem> feedItemschurchnews; 

    int a = Keys.LANGUGAE_KEY; 


    public Fragment_Church_News() { 
     // Required empty public constructor 
    } 


    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_church_list); 

     con = this; 

     if(Keys.LANGUGAE_KEY == 0) 
     { 
      a = 2; 

     } 
     else 
     { 

      a=1; 
     } 

     Toast.makeText(this, "aaaaaaa"+a+"", Toast.LENGTH_SHORT).show(); 
     listView = (ListView) findViewById(R.id.list); 

     feedItemschurchnews = new ArrayList<ChurchNewsFeedItem>(); 

     listAdapter = new ChurchNewsFeedListAdapter(this, feedItemschurchnews,con); 
     listView.setAdapter(listAdapter); 

     Toast.makeText(this, "a", Toast.LENGTH_SHORT).show(); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 


       TextView c = (TextView) view.findViewById(R.id.news_details); 
       String idfromtextview = c.getText().toString().trim(); 


       Intent testIntent = new Intent(Fragment_Church_News.this, MainColapse.class); 
       testIntent.putExtra("txtpersonid", idfromtextview); 
       startActivity(testIntent); 
      } 
     }); 


     ///// 


     // We first check for cached request 
     Cache cache = AppController.getInstance().getRequestQueue().getCache(); 
     Cache.Entry entry = cache.get("http://52.89.46.93/churchListAppDump/?methodName=church.list&app_language_name="+a+""); 
     if (entry != null) { 
      // fetch the data from cache 
      try { 
       String data = new String(entry.data, "UTF-8"); 
       try { 
        parseJsonFeed(new JSONObject(data)); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 

     } else { 
      // making fresh volley request and getting json 
      JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET, 
        "http://52.89.46.93/churchListAppDump/?methodName=church.list&app_language_name="+a+"", null, new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        VolleyLog.d(TAG, "Response: " + response.toString()); 
        ; 
        if (response != null) { 
         parseJsonFeed(response); 
        } 

       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
       } 
      }); 

      // Adding request to volley request queue 
      AppController.getInstance().addToRequestQueue(jsonReq); 
     } 


    } 

    private void parseJsonFeed(JSONObject response) { 
     try { 
      JSONArray feedArray = response.getJSONArray("responseMsg"); 


      for (int i = 0; i < feedArray.length(); i++) { 
       JSONObject feedObj = (JSONObject) feedArray.get(i); 

       ChurchNewsFeedItem item = new ChurchNewsFeedItem(); 
       item.setNews_title(feedObj.getString("church_name")); 

       String image = feedObj.isNull("church_image") ? null : feedObj 
         .getString("church_image"); 
       item.setNews_image(image); 
       item.setNews_details(feedObj.getString("admin_id")); 

       // String priya = feedObj.getString("admin_id"); 

       feedItemschurchnews.add(item); 
      } 

      // notify data changes to list adapater 
      listAdapter.notifyDataSetChanged(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void deleteCache(Context context) { 
     try { 
      File dir = context.getCacheDir(); 
      deleteDir(dir); 
     } catch (Exception e) { 
     } 
    } 

    public static boolean deleteDir(File dir) { 
     if (dir != null && dir.isDirectory()) { 
      String[] children = dir.list(); 
      for (int i = 0; i < children.length; i++) { 
       boolean success = deleteDir(new File(dir, children[i])); 
       if (!success) { 
        return false; 
       } 
      } 
      return dir.delete(); 
     } else if (dir != null && dir.isFile()) { 
      return dir.delete(); 
     } else { 
      return false; 

     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     //getMenuInflater().inflate(R.menu.menu_search, menu); 
     MenuInflater inflater = getMenuInflater(); 
     // Inflate menu to add items to action bar if it is present. 
     inflater.inflate(R.menu.search_main, menu); 

     SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView search = (SearchView) menu.findItem(R.id.action_search).getActionView(); 
     search.setSearchableInfo(manager.getSearchableInfo(getComponentName())); 
     search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       PerfromSearch(newText); 
       return false; 
      } 
     }); 
     return true; 
    } 

    void PerfromSearch(String query) { 

     listAdapter.filter(query); 
    } 


} 

适配器:

public class ChurchNewsFeedListAdapter extends BaseAdapter 
{ 

    private Activity activity; 
    private LayoutInflater inflater; 
    Context mContext; 
    private List<ChurchNewsFeedItem> churhcnewsfeedItems, churchNewsFeedItemssearched=null; 
    ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 

    //List<ChurchNewsFeedItem> arraylist; 

    public ChurchNewsFeedListAdapter(Activity activity, List<ChurchNewsFeedItem> feedItems,Context context) { 
     this.activity = activity; 
     this.churhcnewsfeedItems = feedItems; 

     this.churchNewsFeedItemssearched = new ArrayList<ChurchNewsFeedItem>(); 
     this.churchNewsFeedItemssearched.addAll(feedItems); 

     // mContext = this; 
     this.mContext = context; 


    } 

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

    @Override 
    public Object getItem(int location) { 
     return churhcnewsfeedItems.get(location); 
    } 

    @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.churchnews_feed_item, null); 

     if (imageLoader == null) 
      imageLoader = AppController.getInstance().getImageLoader(); 

     TextView newstitle = (TextView) convertView.findViewById(R.id.news_title); 

     TextView newdetails = (TextView) convertView 
       .findViewById(R.id.news_details); 

     ChurchNewsFeedImageView feedImageView = (ChurchNewsFeedImageView) convertView 
       .findViewById(R.id.news_feedImage); 

     ChurchNewsFeedItem item = churhcnewsfeedItems.get(position); 

     newstitle.setText(item.getNews_title()); 



     // Chcek for empty status message 
     if (!TextUtils.isEmpty(item.getNews_details())) { 
      newdetails.setText(item.getNews_details()); 
      newdetails.setVisibility(View.VISIBLE); 
     } else { 
      // status is empty, remove from view 
      newdetails.setVisibility(View.GONE); 
     } 


     // Feed image 
     if (item.getNews_image() != null) { 
      feedImageView.setImageUrl(item.getNews_image(), imageLoader); 
      feedImageView.setVisibility(View.VISIBLE); 
      feedImageView 
        .setResponseObserver(new ChurchNewsFeedImageView.ResponseObserver() { 
         @Override 
         public void onError() 
         { 


         } 

         @Override 
         public void onSuccess() { 


         } 
        }); 
     } else { 
      feedImageView.setVisibility(View.GONE); 
     } 

     return convertView; 
    } 




    public void filter(String charText) { 
     charText = charText.toLowerCase(Locale.getDefault()); 

     Toast.makeText(mContext, "divakar"+churchNewsFeedItemssearched, Toast.LENGTH_SHORT).show(); 
     churhcnewsfeedItems.clear(); 
     if (charText.length() == 0) { 
      churhcnewsfeedItems.addAll(churchNewsFeedItemssearched); 

     } else { 

      for (ChurchNewsFeedItem wp : churchNewsFeedItemssearched) { 
       if (wp.getNews_title().toLowerCase(Locale.getDefault()) 
         .contains(charText)) { 
        churhcnewsfeedItems.add(wp); 

       } 
      } 
     } 
     notifyDataSetChanged(); 
    } 
} 
+0

把一些登录您的适配器过滤方式,并从churchNewsFeedItemssearched – FAT

+0

添加项目后检查churhcnewsfeedItems尺寸是啊..我没把它记录显示,chruchnewsfeeditemssearched是空的,但我初始化并添加所有的饲料项目插入适配器建筑工 –

看来你churchNewsFeedItemssearched名单NULL。因为当你初始化ChurchNewsFeedListAdapter你逝去的feedItemschurchnews0项目:

listAdapter = new ChurchNewsFeedListAdapter(this, feedItemschurchnews, con); 

所以,这是你的适配器的构造方法的工作原理如下图所示:

public ChurchNewsFeedListAdapter(Activity activity, List<ChurchNewsFeedItem> feedItems,Context context) { 
    this.activity = activity; 
    this.churhcnewsfeedItems = feedItems; // SIZE 0 

    this.churchNewsFeedItemssearched = new ArrayList<ChurchNewsFeedItem>(); 
    this.churchNewsFeedItemssearched.addAll(feedItems); // SIZE 0 
} 

SOLUTION:

必须更新列表churchNewsFeedItemssearched

Add方法updateSearchedList()ChurchNewsFeedListAdapter类更新churchNewsFeedItemssearched和添加的所有项目feedItemschurchnews之后,从parseJsonFeed()调用此方法。

更新您的代码如下:

ChurchNewsFeedListAdapter:

public void updateSearchedList() { 

    churchNewsFeedItemssearched.addAll(churhcnewsfeedItems); 
} 

Fragment_Church_News:

private void parseJsonFeed(JSONObject response) { 

    try { 
     JSONArray feedArray = response.getJSONArray("responseMsg"); 

     for (int i = 0; i < feedArray.length(); i++) { 
      JSONObject feedObj = (JSONObject) feedArray.get(i); 

      ChurchNewsFeedItem item = new ChurchNewsFeedItem(); 
      item.setNews_title(feedObj.getString("church_name")); 

      String image = feedObj.isNull("church_image") ? null : feedObj 
        .getString("church_image"); 
      item.setNews_image(image); 
      item.setNews_details(feedObj.getString("admin_id")); 

      // String priya = feedObj.getString("admin_id"); 

      feedItemschurchnews.add(item); 
     } 

     // Update 
     listAdapter.updateSearchedList(); 

     // notify data changes to list adapater 
     listAdapter.notifyDataSetChanged(); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

希望这将工作〜

+0

谢谢。代码运行良好。 –

+0

最受欢迎的亲爱的:) – FAT