2016-07-05 9 views
1

私はアプリを開発しています。私は検索機能を追加したいが、私はそれをしなかった。私はリスト全体を検索しようとしますが、検索はリストビュー内の1つの項目でのみ機能します。ここでjsonリストビューにデータを検索する方法は?

は私のMainActivityコード

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

あなたは私の検索 'についての詳細をexplaintすることができ、私はそれだけで1つの項目に仕事だリストを検索するとき –

+0

view'リストに一つだけのアイテムで作業されて... –

答えて

1

もう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(); 
} 
+1

は、それが働いていますありがとうございました:) –

+0

感謝をそれは美しく仕事です:) –

関連する問題