簡體   English   中英

如何使用Volley JSON Android實現SearchView?

[英]How to Implement SearchView using volley JSON android?

我在一個Android項目上工作,我必須在操作欄上實現搜索視圖。 我能夠使用齊射將JSON數據解析到回收器視圖中。 當我嘗試添加搜索視圖並開始輸入文本時,列表逐漸消失。

活動:

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

似乎您的churchNewsFeedItemssearched列表為NULL 因為當您初始化ChurchNewsFeedListAdapter您將傳遞帶有0項目的feedItemschurchnews

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
}

解:

您必須更新list churchNewsFeedItemssearched

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

希望這會起作用〜

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM