2015-10-13 50 views
1

我想在我的應用程序的操作欄中創建搜索視圖,該搜索視圖將執行搜索(即根據輸入的字母顯示列表視圖中的項目名稱)通過應用程序中的列表視圖。 ListView使用一個listadapter類。當我在搜索視圖中輸入文字時,沒有任何反應。我在搜索視圖方面頗爲新穎,試圖使用從網絡獲取的代碼,但沒有幫助。 :(能否請你建議我在如何做到這一點我應該創建另一個類爲它在Android操作欄上通過列表視圖執行過濾搜索

這裏是我的代碼:??

ListAdapter.java

public class ListAdapter extends BaseAdapter{ 
    Vector listData = null; 

     public void setData(Vector data) { 
      listData = data; 
     } 

    private Context _context; 
    private List<String> list; 
    ViewHolder holder=null; 
     View row=null; 

    public ListAdapter(Context _context,List<String> list) 
    { 
     this._context=_context; 
     this.list=list; 
    } 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return list.get(arg0); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return arg0; 
    } 
    @Override 

     public int getViewTypeCount() { 

     return getCount(); 

     } 

     @Override 

     public int getItemViewType(int position) { 

     return position; 
     } 

     private static class ViewHolder 
     { 
      public TextView textView; 


      public ViewHolder(View row) { 
       // TODO Auto-generated constructor stub 
       textView = (TextView) row.findViewById(R.id.rowTextView); 

      } 

     } 



    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 
     // TODO Auto-generated method stub 

     row=convertView; 
     holder=null; 

      try{ 


       if(row==null) 
       { 
        LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        row = inflater.inflate(R.layout.simplerow, viewGroup, false); 
        holder=new ViewHolder(row); 
        row.setTag(holder); 
        Log.d("newrow", "New row"); 

      /*/View row = convertView; 
      if (convertView == null) { 
       LayoutInflater inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       row = inflater.inflate(R.layout.simplerow, viewGroup, false); 
      } 


      TextView textView = (TextView) row.findViewById(R.id.rowTextView);*/ 
      holder.textView.setText(list.get(position).toString()); 

       } 
      else 
      { 

       holder= (ViewHolder) row.getTag(); 
       Log.d("recycle", "Recycling stuff"); 

      } 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 

       } 


      try 
      { 
       if(row!=null) 
       { 
        if(position==MainActivity.selected_item) 
        { 
        row.setBackgroundColor(Color.RED); 
        } 
        else 
        { 
         row.setBackgroundColor(Color.BLACK); 
        } 
       } 
      } 
      catch(Exception e) 
      { 

      } 

      return row; 

    } 
    public Filter getFilter() { 
     // TODO Auto-generated method stub 

     return null; 
    } 


    } 

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener, OnCompletionListener { 

    ListView list; 
    ArrayAdapter<String> adapter ; 
    ListAdapter listAdapter; 
    ArrayList<String> listTest; 
    ArrayList<String> listSoundNames; 
    ImageButton play,stop,back,next; 
    String songpath,song,title; 
    int index,current_position; 
    File[] listFile; 
    SharedPreferences sharedPref; 
    MediaPlayer mp,mp2; 
    ActionBar bar; 
    private Boolean state=false; 
    private static int save = -1; 
    int count=0; 
    private static final String TAG = MainActivity.class.getSimpleName(); 
    private Context _context = this; 
    public static int selected_item=-1; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 



     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     sharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     song = sharedPref.getString("songname", "name"); 

     mp=new MediaPlayer(); 
     mp2 = new MediaPlayer(); 

     mp.setOnCompletionListener(this); 


     list = (ListView)findViewById(R.id.list); 
     //list.setTextFilterEnabled(true); 
     list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

     _context=this; 

     adapter = new ArrayAdapter<String>(_context,R.layout.simplerow, listSoundNames); 


     listTest = new ArrayList<String>(); 
     listSoundNames=new ArrayList<String>(); 

     play = (ImageButton)findViewById(R.id.play); 
     back = (ImageButton)findViewById(R.id.prev); 
     next = (ImageButton)findViewById(R.id.next); 

     //adding listeners 
     play.setOnClickListener(this); 
     back.setOnClickListener(this); 
     next.setOnClickListener(this); 


     //action bar controls 
     bar = getActionBar(); 
     bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#DF0174"))); 
     //bar.setIcon(new ColorDrawable(getResources().getColor(android.R.color.transparent))); 

     EditText editText = new EditText(getApplicationContext()); 
     getActionBar().setCustomView(editText); 


     //bar.setDisplayShowTitleEnabled(true); 
     //bar.setDisplayHomeAsUpEnabled(true); 

     Scanner("/sdcard/");//storage path 


     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
     /////////////////////////////////////*Adding listener to songs*////////////////////////////////////////////////// 
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

     if(listTest.size() != 0) 
     { 
      //listAdapter = new ArrayAdapter<String> (MainActivity.this,R.layout.simplerow, listSoundNames); 

      listAdapter=new ListAdapter(_context,listSoundNames); 
      list.setAdapter(listAdapter); 
      list.setOnItemClickListener(new OnItemClickListener() 
      { 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
       //////////////////changing list item background on click/////////////////// 


       //list.setSelection(position); 
       view.setSelected(true); 
       ///////////////////PROBLEM///////////// 

       for(int a = 0; a < parent.getChildCount(); a++) 
       { 
        list.clearChoices(); 
        parent.getChildAt(a).setBackgroundColor(Color.BLACK); 


       } 

       selected_item=position; 
       // view.setBackgroundColor(Color.RED); 


       //////////////////////////////////////////////////////////////////////////// 
       //accessing song path 
       String selected = listTest.get(position); 
       list.setItemChecked(position, true); 
       list.setSelection(position); 

       //accessing the song name 
       String name = (String) ((TextView) view).getText(); 
       title = name; 
       //bar.setTitle(title); 
       //Log.e(TAG, name); 

       Toast.makeText(getApplicationContext(), name, Toast.LENGTH_SHORT).show(); 
       try{ 
        mp.reset(); 
        mp.setDataSource(listTest.get(position));//source 
        mp.prepare(); 
        mp.start(); 
        index = position; 
        play.setImageResource(R.drawable.pause); 
        } 
       catch(Exception e){e.printStackTrace();} 



      } 


      }); 




      } 

     } 



     //////////////////////////////////////////////////////////////////////////////////////////// 
     //////////////////////////////////*Songs added here to list*//////////////////////////////// 
     //////////////////////////////////////////////////////////////////////////////////////////// 

     private void Scanner(String path) { 
      // TODO Auto-generated method stub 
      { 
       try 
       { 
         File fl = new File(path); 
         File[] listOfFiles = fl.listFiles();    

         for (File listOfFile : listOfFiles) 
         { 
          String s = listOfFile.getName(); 

          if(s.endsWith(".mp3")) 
          { 

          songpath = listOfFile.getPath(); 
          listTest.add(songpath);//adding song names to list 
          //listTest.toString().replaceFirst(songpath, s); 



          // store file name in listSoundNames 
          int pos = s.lastIndexOf("."); 
          if (pos > 0) 
          { 
           song = s.substring(0, pos); 
          } 
          listSoundNames.add(song); 

          } 


          ///////////////////////////////// 
          File f = new File(path+s+"/"); 
          if (f.exists() && f.isDirectory()) { 
          Scanner(path+s+"/"); 
          } 
          //////////////////////////////// 


         } 



       } 
      catch (Exception e) { } 
      } 

      } 








    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

     if (v.equals(play)) 
     { 
      if(mp.isPlaying()) 
      { 
       mp.pause(); 
       Toast.makeText(MainActivity.this, "paused", Toast.LENGTH_SHORT).show(); 
       //change in button image// 
       play.setImageResource(R.drawable.play); 

      } 
      else 
      { 
       mp.start(); 
       Toast.makeText(MainActivity.this, "started", Toast.LENGTH_SHORT).show(); 
       //change in button image// 
       play.setImageResource(R.drawable.pause); 
       // 
      } 
     } 


      if (v.equals(back)) 
      { 
       mp.stop(); 
       mp.reset(); 
       //bar.setTitle(song); 
       if(index!=0) 
       { 
       index = index -1; 
       } 
       else 
       { 
        index = (list.getAdapter().getCount()-1)-1; 

       } 

       Uri uri = Uri.parse(listTest.get(index).toString());//getting the path of next song 
       try { 


        mp.setDataSource(getApplicationContext(), uri);//setting new data source 


       } catch (IllegalArgumentException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (SecurityException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        Toast.makeText(MainActivity.this, "ERROR", Toast.LENGTH_SHORT).show();///PROBLEM:MOVING HERE AFTER CLICKING NEXT BUTTON 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       try { 
        mp.prepare(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }   
       mp.start();//PROBLEM: NOT PLAYING 
       Toast.makeText(MainActivity.this, ""+uri, Toast.LENGTH_SHORT).show(); 

      } 


      if (v.equals(next)) 
      { 

       mp.stop(); 
       mp.reset(); 
       index = index +1; 


       Uri uri = Uri.parse(listTest.get(index).toString());//getting the path of next song 

       try { 


        mp.setDataSource(getApplicationContext(), uri);//setting new data source 


       } catch (IllegalArgumentException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (SecurityException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        Toast.makeText(MainActivity.this, "ERROR", Toast.LENGTH_SHORT).show();///PROBLEM:MOVING HERE AFTER CLICKING NEXT BUTTON 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       try { 
        mp.prepare(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }   
       mp.start();//PROBLEM: NOT PLAYING 
       Toast.makeText(MainActivity.this, ""+uri, Toast.LENGTH_SHORT).show(); 


      } 


    } 


    @Override 
    public void onCompletion(MediaPlayer arg0) { 
     // TODO Auto-generated method stub 
     play.setImageResource(R.drawable.play); 
    } 

    /*@Override 
    protected void onStop() { 
     super.onStop(); 
     mp.stop(); 
     Toast.makeText(getApplicationContext(), "stopped", Toast.LENGTH_LONG).show(); 

    }*/ 

    //////////////////////////////////////////Search box///////////////////////////////////////////////////// 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 



     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
      SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 

       searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
       searchView.setIconifiedByDefault(false); 
       searchView.setQueryHint(Html.fromHtml(("<font color = #ffffff>"+"Listen Now"+"</font>"))); 



      SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() 
      { 
       @Override 
       public boolean onQueryTextChange(String newText) 
       { 
        // this is your adapter that will be filtered 
        //listAdapter.getFilter().filter(newText); 

        Toast.makeText(getApplicationContext(), "type"+newText, Toast.LENGTH_SHORT).show(); 
        return true; 
       } 
       @Override 
       public boolean onQueryTextSubmit(String query) 
       { 
        // this is your adapter that will be filtered 
        //((Filterable) listAdapter).getFilter().filter(query); 
        //listAdapter.getFilter().filter(query); 
        Toast.makeText(getApplicationContext(), query, Toast.LENGTH_SHORT).show(); 

        /* try 
        { 
          File fl = new File("/sdcard/"); 
          File[] listOfFiles = fl.listFiles(); 
          String selectedPath=""; 

          for (File listOfFile : listOfFiles) 
          { 
           String s = listOfFile.getName(); 

           if(s.equalsIgnoreCase(query) && s.endsWith(".mp3")) 
           { 

            selectedPath= listOfFile.getPath();//not receiving the path:PROBLEM:HOLDING THE POSITION FOR LIST ITEM 


           //listTest.add(songpath);//adding song names to list 
           //listTest.toString().replaceFirst(songpath, s); 
           Toast.makeText(getApplicationContext(), listOfFile.getPath(), Toast.LENGTH_SHORT).show(); 

           /*mp.setDataSource(selectedPath); 
           mp.prepare(); 
           mp.start(); 

           } 



           ///////////////////////////////// 
           File f = new File("/sdcard/"+s+"/"); 
           if (f.exists() && f.isDirectory()) { 
           Scanner("/sdcard/"+s+"/"); 
           } 
           //////////////////////////////// 


          } 



        } 

       catch (Exception e) { }*/ 

        return true; 
        } 
      }; 
      searchView.setOnQueryTextListener(textChangeListener); 



      return super.onCreateOptionsMenu(menu); 

    } 


} 

截圖:

Before performing search

while performing search

回答

0

1)在你layout.xml

<android.support.v7.widget.SearchView 
     android:id="@+id/mSearchView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:searchIcon="@android:drawable/ic_menu_search" 
     app:defaultQueryHint="@string/search_hint"/> 

2)在全球範圍內(各功能外)聲明SearchView searchView;

3)將您的佈局小部件searchView = (SearchView) view.findViewById(R.id.mSearchView);的引用設置爲您喜歡的任何函數/方法(初始化視圖的位置)。

4),然後添加此代碼在任何函數/方法你喜歡:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       // your code when you submit your search 
       return true; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       // your code when you type on your searchview 
       return true; 
      } 
     }); 

這是如何實現searchView

+0

這適用於操作欄內的searchview嗎? – Sri

+0

不,看看這個代碼:http://stackoverflow.com/questions/13759148/center-searchview-in-action-bar –