如何将数据搜索到json列表视图?

时间:2016-07-05 07:10:58

标签: android json listview search

我正在开发一款应用。我想添加搜索功能,但我没有做到这一点。我尝试搜索整个列表,但我的搜索仅在列表视图中的一个项目中起作用。

这是我的MainActivity Code

JSONObject jsonobject;
JSONArray jsonarray;
ListView listview;
ListViewAdapter adapter;
private ProgressBar spinner;
ArrayList<HashMap<String, String>> arraylist;
private long lastPressedTime;
public   static String imgURL = "url";
public static String VIDEO_ID = "videoId";
public static String TITLE = "title";
EditText editsearch;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    final WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
    final  boolean b=wifiManager.isWifiEnabled();

    ConnectivityManager cManager=(ConnectivityManager)getSystemService(this.CONNECTIVITY_SERVICE);
    final NetworkInfo nInfo=cManager.getActiveNetworkInfo();
    if(nInfo!=null&& nInfo.isConnected()) {
        Toast.makeText(this, "You are Connected to the Internet", Toast.LENGTH_LONG).show();
        setContentView(R.layout.listview_main);
        spinner = (ProgressBar)findViewById(R.id.progressBar1);
        new DownloadJSON().execute();


    }
    else {

        new AlertDialog.Builder(this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle("Your DATA Connection is Currently Unreachable")
                .setMessage("Connect your WiFi or 2G/3G DATA Connection")
                .setPositiveButton("WiFi ", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        try {
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    final Intent mainIntent = new Intent(MainActivity.this, MainActivity.class);
                                    MainActivity.this.startActivity(mainIntent);
                                    MainActivity.this.finish();
                                }
                            }, 5000);
                            wifiManager.setWifiEnabled(true);

                            Toast.makeText(MainActivity.this, "WiFi Enabling in 5sec Please Wait", Toast.LENGTH_LONG).show();
                        } catch (Exception e) {
                            throw new RuntimeException(e);

                        }

                    }
                })
                .setNegativeButton("3G/2G ", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //use here tablayout to work when 3G/2G connecion is available

                        new Handler().postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                final Intent mainIntent = new Intent(MainActivity.this, MainActivity.class);
                                MainActivity.this.startActivity(mainIntent);
                                MainActivity.this.finish();
                            }
                        }, 5000);

                        Intent myints = new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
                        Toast.makeText(MainActivity.this, "Your DATA Connection is NOW Connected", Toast.LENGTH_LONG).show();
                        startActivity(myints);

                    }
                })

                .setNeutralButton("Exit", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "To use this Application you have to Connected to the Internet", Toast.LENGTH_LONG).show();
                        finish();
                    }
                })


                .setCancelable(false)
                .show();

    }

}

public class DownloadJSON extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        spinner.setVisibility(View.VISIBLE);
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Create an array
        arraylist = new ArrayList<HashMap<String, String>>();


        // Retrieve JSON Objects from the given URL address
        jsonobject = JSONfunctions.getJSONfromURL("https://www.googleapis.com/youtube/v3/search?part=id%2Csnippet&q=bangla+video+song&maxResults=50&key=api_key");

        try {
            // Locate the array name in JSON

            JSONArray jsonarray = jsonobject.getJSONArray("items");

            for (int i = 0; i < jsonarray.length(); i++) {
                HashMap<String, String> map = new HashMap<String, String>();
                jsonobject = jsonarray.getJSONObject(i);
                // Retrive JSON Objects
                JSONObject jsonObjId = jsonobject.getJSONObject("id");
                map.put("videoId", jsonObjId.getString("videoId"));

                JSONObject jsonObjSnippet = jsonobject.getJSONObject("snippet");
                map.put("title", jsonObjSnippet.getString("title"));

                //map.put("description", jsonObjSnippet.getString("description"));
                // map.put("flag", jsonobject.getString("flag"));

                JSONObject jsonObjThumbnail = jsonObjSnippet.getJSONObject("thumbnails");
                String imgURL = jsonObjThumbnail.getJSONObject("high").getString("url");
                map.put("url",imgURL);


                // Set the JSON Objects into the array
                arraylist.add(map);
            }
        } catch (JSONException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void args) {
        // Locate the listview in listview_main.xml
        listview = (ListView) findViewById(R.id.listview);
        // Pass the results into ListViewAdapter.java
        adapter = new ListViewAdapter(MainActivity.this, arraylist);
        // Set the adapter to the ListView
        listview.setAdapter(adapter);
        // Close the progressdialog
        spinner.setVisibility(View.GONE);

        editsearch = (EditText) findViewById(R.id.search);

        // Capture Text in EditText
        editsearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                String text = editsearch.getText().toString().toLowerCase(Locale.getDefault());
                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
            }
        });

    }
}


// Dialouge Box
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    //Handle the back button
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        //Ask the user if they want to quit
        new android.support.v7.app.AlertDialog.Builder (this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle(R.string.quit)
                .setMessage(R.string.really_quit)
                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        //Stop the activity
                        MainActivity.this.finish();
                    }

                })


                .setNeutralButton(R.string.neutral, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(), "Rate This App", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent("android.intent.action.VIEW", Uri.parse("https://play.google.com/store/apps/details?id=")));
                    }
                })

                .setNegativeButton(R.string.no, null)
                .show();

        return true;
    } else {
        return super.onKeyDown(keyCode, event);
    }

}

这是我的列表视图适配器代码。

 // Declare Variables
    MainActivity main;
    private PublisherInterstitialAd mPublisherInterstitialAd;
    Context context;
    LayoutInflater inflater;
    ArrayList<HashMap<String, String>> data;
    ImageLoader imageLoader;
    HashMap<String, String> resultp = new HashMap<String, String>();





    public ListViewAdapter(Context context,
                           ArrayList<HashMap<String, String>> arraylist) {
        this.context = context;
        data = arraylist;
        imageLoader = new ImageLoader(context);
    }

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

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

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

    public View getView(final int position, View view, ViewGroup parent) {
        // Declare Variables
        TextView country;
        ImageView flag;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View itemView = inflater.inflate(R.layout.listview_item, parent, false);
        // Get the position
        resultp = data.get(position);

        // Locate the TextViews in listview_item.xml
        //rank = (TextView) itemView.findViewById(R.id.rank);
        country = (TextView) itemView.findViewById(R.id.country);
        // population = (TextView) itemView.findViewById(R.id.population);

        // Locate the ImageView in listview_item.xml
        flag = (ImageView) itemView.findViewById(R.id.flag);

        // Capture position and set results to the TextViews
        // rank.setText(resultp.get(MainActivity.VIDEO_ID));
        country.setText(resultp.get(MainActivity.TITLE));
        // population.setText(resultp.get(MainActivity.DESCRIPTION));
        // Capture position and set results to the ImageView
        // Passes flag images URL into ImageLoader.class
        imageLoader.DisplayImage(resultp.get(MainActivity.imgURL), flag);
        // Capture ListView item click

        itemView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // Get the position

                    resultp = data.get(position);
                    Intent intent = new Intent(context, PlayerViewDemoActivity.class);
                    intent.putExtra("videoId", resultp.get(MainActivity.VIDEO_ID));
                    context.startActivity(intent);
                    mPublisherInterstitialAd.isLoaded();
                    mPublisherInterstitialAd.show();


                requestNewInterstitial();

            }
        });
        return itemView;


    }

    private void requestNewInterstitial() {
        PublisherAdRequest adRequest = new PublisherAdRequest.Builder()
                .addTestDevice("020AC93F90A14C29209AF3CA716FFBD4")
                .build();

        mPublisherInterstitialAd.loadAd(adRequest);


    }

    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        data.clear();
        if (charText.length() == 0) {
            data.add(resultp); // resultp is hashmap

        } else {


            if (resultp.get(MainActivity.TITLE).toLowerCase(Locale.getDefault())
                    .contains(charText)) {
                data.add(resultp);
            }



        }
        notifyDataSetChanged();
    }
}

1 个答案:

答案 0 :(得分:1)

你应该再宣布一个ArrayList name allData,它总是存储所有对象。

ArrayList<HashMap<String, String>> allOriginalData; // always store all object 
ArrayList<HashMap<String, String>> data;    // use for store object that display in the ListView

public ListViewAdapter(Context context,
                       ArrayList<HashMap<String, String>> arraylist) {
    this.context = context;
    data = arraylist;
    allOriginalData = new ArrayList<HashMap<String, String>>(arraylist);
    imageLoader = new ImageLoader(context);
}

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

    if (charText.length() == 0) {
        // search empty -> new data = all original data
        data = new ArrayList<HashMap<String, String>>(allData);
    } else {
      // loop all original data
      // check the condition and make the new data for display in ListView
      for(int i = 0; i < allOriginalData.size(); i++){
        HashMap<String, String> resultA = allOriginalData.get(i);
        if (resultA.get(MainActivity.TITLE).toLowerCase(Locale.getDefault())
                .contains(charText)) {
            data.add(resultA);
        }
      }
    }
    notifyDataSetChanged();
}