2016-05-12 51 views
1

后,我解决我的问题在这里:Attempt to invoke virtual method 'void android.widget.ListView.clearTextFilter()' on a null object reference搜索查看过滤器没有工作

当我在搜索框放在文字的变奏过滤器仍无法正常工作。

这是我的代码

package intikom.streammobile.Customer; 
 

 
import android.app.ProgressDialog; 
 
import android.app.SearchManager; 
 
import android.content.Context; 
 
import android.content.Intent; 
 
import android.content.SharedPreferences; 
 
import android.os.Bundle; 
 
import android.support.v7.app.AppCompatActivity; 
 
import android.support.v7.widget.SearchView; 
 
import android.text.TextUtils; 
 
import android.view.KeyEvent; 
 
import android.view.Menu; 
 
import android.view.MenuInflater; 
 
import android.view.MenuItem; 
 
import android.view.View; 
 
import android.widget.AdapterView; 
 
import android.widget.ListView; 
 
import android.widget.Toast; 
 

 
import org.json.simple.JSONArray; 
 
import org.json.simple.JSONObject; 
 
import org.json.simple.parser.JSONParser; 
 
import org.json.simple.parser.ParseException; 
 

 
import java.util.ArrayList; 
 
import java.util.List; 
 

 
import intikom.streammobile.Index; 
 
import intikom.streammobile.R; 
 
import intikom.streammobile.Utility.BigProccess; 
 
import intikom.streammobile.Utility.RESTClient; 
 
import intikom.streammobile.Workflow.MyRequest.ListRequestItem; 
 
import intikom.streammobile.Workflow.WorkflowActivity; 
 

 
public class ListCustomer extends AppCompatActivity implements SearchView.OnQueryTextListener { 
 
    private static final String ARG_SECTION_NUMBER = "section_number"; 
 
    private static String URLService; 
 
    private static String rowsPerPage; 
 
    private static ListView lv; 
 
    private static SharedPreferences pref; 
 
    private List<ListCustomerItem> mItems; 
 
    private List<ListCustomerItem> mItems2; 
 
    private ListCustomerItem item; 
 
    private static String customerID; 
 

 

 
    public ListCustomer() { 
 
    } 
 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_list_customer); 
 

 
     URLService = getString(R.string.URLService); 
 
     final ListView lv = (ListView)findViewById(R.id.lvCustomerList); 
 
     lv.setTextFilterEnabled(true); 
 
     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 
      @Override 
 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
 
       item = new ListCustomerItem(); 
 
       item = mItems.get(position); 
 
       SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
 
       SharedPreferences.Editor editor = pref.edit(); 
 
       editor.putString("CustomerID", item.CustID); 
 
       editor.putString("CustomerName", item.CustName); 
 
       editor.commit(); 
 

 

 
       Intent i = new Intent(getApplicationContext(),WorkflowActivity.class); 
 
       i.putExtra("CustomerName", item.CustName); 
 
       setResult(1000, i); 
 
       finish(); 
 

 
      } 
 
     }); 
 

 
     getCustomer(); 
 
     getLocal(); 
 
     if (mItems==null) 
 
     { 
 
      if(mItems2==null) { 
 
       Toast.makeText(this, "Internet connection appears to be offline", 
 
         Toast.LENGTH_LONG).show(); 
 
      } 
 
      else 
 
      { 
 
       lv.setAdapter(new ListCustomerAdapter(this, mItems2)); 
 

 
      } 
 
     } 
 
     else 
 
     { 
 
      lv.setAdapter(new ListCustomerAdapter(this, mItems)); 
 

 
     } 
 

 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
 
    } 
 

 
    @Override 
 
    public boolean onCreateOptionsMenu(Menu menu) { 
 

 
     getMenuInflater().inflate(R.menu.searchbox, menu); 
 

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

 
     searchView.setSubmitButtonEnabled(true); 
 
     searchView.setOnQueryTextListener(this); 
 

 
     return true; 
 
    } 
 

 
    
 
    @Override 
 
    public boolean onQueryTextSubmit(String query) { 
 
     return false; 
 
    } 
 

 
    @Override 
 
    public boolean onQueryTextChange(String newText) { 
 
     if (TextUtils.isEmpty(newText)) 
 
     { 
 
      lv.clearTextFilter(); 
 
     } 
 
     else 
 
     { 
 
      lv.setFilterText(newText.toString()); 
 
     } 
 

 

 
     return true; 
 
    } 
 
}

我的适配器

package intikom.streammobile.Customer; 
 

 
import android.content.Context; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 
import android.widget.ArrayAdapter; 
 
import android.widget.TextView; 
 

 
import java.util.List; 
 

 
import intikom.streammobile.R; 
 

 
/** 
 
* Created by agilang on 20/01/2016. 
 
*/ 
 

 
public class ListCustomerAdapter extends ArrayAdapter<ListCustomerItem> { 
 
    public ListCustomerAdapter(Context context, List<ListCustomerItem> items) 
 
    { 
 
     super(context, R.layout.style_fragment_list_customer, items); 
 
    } 
 

 
    @Override 
 
    public View getView(int position, View convertView, ViewGroup parent) { 
 
     ViewHolder viewHolder; 
 

 
     if(convertView == null) { 
 
      // inflate the GridView item layout 
 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
 
      convertView = inflater.inflate(R.layout.style_fragment_list_customer, parent, false); 
 

 
      // initialize the view holder 
 
      viewHolder = new ViewHolder(); 
 
      viewHolder.tvCustName = (TextView) convertView.findViewById(R.id.tvCustName); 
 
      viewHolder.tvCustLocation = (TextView) convertView.findViewById(R.id.tvCustLocation); 
 

 
      convertView.setTag(viewHolder); 
 
     } else { 
 
      // recycle the already inflated view 
 
      viewHolder = (ViewHolder) convertView.getTag(); 
 
     } 
 

 
     // update the item view 
 
     ListCustomerItem item = getItem(position); 
 
     viewHolder.tvCustName.setText(item.CustName); 
 
     viewHolder.tvCustLocation.setText(item.CustLocation); 
 

 
     return convertView; 
 
    } 
 

 
    /** 
 
    * The view holder design pattern prevents using findViewById() 
 
    * repeatedly in the getView() method of the adapter. 
 
    * 
 
    * @see http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder 
 
    */ 
 
    private static class ViewHolder { 
 
     TextView tvCustName; 
 
     TextView tvCustLocation; 
 
    } 
 
}

和菜单

<?xml version="1.0" encoding="utf-8"?> 
 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
 

 
    <item 
 
     android:id="@+id/action_search" 
 
     android:icon="@android:drawable/ic_menu_search" 
 
     app:showAsAction="collapseActionView|always" 
 
     android:title="Search" 
 
     app:actionViewClass="android.support.v7.widget.SearchView"/> 
 
</menu>

这里之前键入文本 过滤 enter image description here

任何帮助表示赞赏

+0

我认为问题出在您的适配器上。 – Alexander

回答

1

enter image description here

后,我觉得你的代码:// 一些地方在你的代码(如onCreate)定义您的Adapter像这样:

​​

然后你改变onQueryTextChange方法弄成这个样子:

public boolean onQueryTextChange(String newText) { 
    if (TextUtils.isEmpty(newText)) 
    { 
     adapter.getFilter().filter(""); 
     lv.clearTextFilter(); 
    } 
    else 
    { 
     lv.setFilterText(newText); 
     adapter.getFilter().filter(newText); 
    } 
    return true; 
} 

您可能还需要检查出的suggestion here about creating a custom Filter to be returned by the getFilter() method of your Adapter。 我希望这可以帮助。