2015-10-07 56 views
0

我试图添加与过滤器类的textwatcher,但它不工作plz帮助。我通过使用url的服务器获取json数组。搜索(过滤器)不能很好地工作。自定义适配器与搜索不工作

公共类CallDetails延伸活动{

SessionManager session; 
ArrayList<Drivers> driverList = new ArrayList<Drivers>(); 
private List<Drivers> driverlist = null; 
ListView listview; 
ImageButton btback; 
DriverAdapter dadapter; 
String uid; 
String name; 
String email; 
String odtyp; 
static String oid;  
Drivers driver; 

private EditText editTextFilter; 
private static String OUTBOX_URL =""; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.calldetails); 
    Intent i = getIntent(); 
    oid =i.getStringExtra("orderId"); 
    odtyp =i.getStringExtra("ordertype");  
    OUTBOX_URL ="http://www.gdrive.com/api/calldetails.php?id="+oid; 

    //managing session... 
    session = new SessionManager(getApplicationContext());  
    HashMap<String, String> user = session.getUserDetails(); 
    name = user.get(SessionManager.KEY_NAME);   
    email = user.get(SessionManager.KEY_EMAIL); 
    uid = user.get(SessionManager.KEY_UID); 
    btback =(ImageButton)findViewById(R.id.btnBack);   
    btback.setVisibility(View.INVISIBLE); 

    // Locate the EditText in listview_main.xml 
    editTextFilter = (EditText)findViewById(R.id.editTextFilter); 
    editTextFilter.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void afterTextChanged(Editable arg0) { 
      String text = editTextFilter.getText().toString().toLowerCase(Locale.getDefault()); 
      dadapter.filter(text); 
     } 
     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, 
       int arg2, int arg3){ /* to do*/ } 
     @Override 
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, 
       int arg3) { /*to do*/ } 
    }); 


    //populating view with data... 
    //driverList = new ArrayList<Drivers>(); 
    new JSONAsyncTask().execute(OUTBOX_URL); 
    listview = (ListView)findViewById(R.id.drlist);   
    dadapter = new DriverAdapter(CallDetails.this, R.layout.list_item, driverList); 
    listview.setItemsCanFocus(false); 
    listview.setAdapter(dadapter); 
    //populating list ends 


    listview.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getApplicationContext(), driverList.get(position).getName(), Toast.LENGTH_LONG).show();    
     } 
    }); 
    } 
    public void back(View v){ 
     Intent back = new Intent(getApplicationContext(), SafetyDrive.class); 
     startActivity(back); 
     finish(); 
} 


private class DriverAdapter extends ArrayAdapter<Drivers> { 
    Context context; 
    int Resource; 
    LayoutInflater inflater; 
    ArrayList<Drivers> driverList = new ArrayList<Drivers>(); 

    public DriverAdapter(Context context, int layoutResourceId,ArrayList<Drivers> drs) { 
     super(context, layoutResourceId, drs); 
     //inflater = ((Activity) context).getLayoutInflater(); 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     Resource = layoutResourceId; 
     driverList = drs;   
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     //Log.d("in ", "view start"); 
     View item = convertView; 
     DriverWrapper DriverWrapper = null;   
     if (item == null) { 
      DriverWrapper = new DriverWrapper(); 
      item = inflater.inflate(Resource, null);     
      DriverWrapper.ename = (TextView) item.findViewById(R.id.textName); 
      DriverWrapper.ephone = (TextView) item.findViewById(R.id.textPhone);     
      DriverWrapper.mkcall = (ImageButton) item.findViewById(R.id.btnphone);    
      item.setTag(DriverWrapper); 
     } else { 
      DriverWrapper = (DriverWrapper) item.getTag(); 
     } 
     Drivers driver = driverList.get(position); 
     DriverWrapper.ename.setText("Name: " + driver.getName()); 
     DriverWrapper.ephone.setText("Phone: " + driver.getPhone()); 
     final String dp = driver.getPhone().trim(); 

     DriverWrapper.mkcall.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //making call.. 
       //Log.e("no is", dp); 
       Intent callIntent = new Intent(Intent.ACTION_CALL); 
       callIntent.setData(Uri.parse("tel:" +dp)); 
       //callIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(callIntent); 
       //finish(); 
      } 
     }); 

     return item; 
    } 
    class DriverWrapper { 
     TextView ename; 
     TextView ephone; 
     ImageButton mkcall; 
     //ImageButton msg; 
    } 

    // Filter Class  
    public void filter(String charText) { 
     charText = charText.toLowerCase(Locale.getDefault()); 
     driverList.clear(); 
     if (charText.length() == 0) {    
      driverList.addAll(driverList); 
     } else { 
      for (Drivers driver : driverList) { 
       if (driver.getName().toLowerCase(Locale.getDefault()).contains(charText)) { 
        driverList.add(driver); 
       } 
      } 
     } 
     notifyDataSetChanged(); 
    } 
} 

类JSONAsyncTask延伸的AsyncTask {

ProgressDialog dialog;  
    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 
     dialog = new ProgressDialog(CallDetails.this); 
     dialog.setMessage("Loading, please wait"); 
     dialog.show(); 
     dialog.setCancelable(false); 
    } 

    @Override 
    protected Boolean doInBackground(String... urls) { 
     try { 
      //Log.d("in at-", "asynctask"); 
      HttpGet httppost = new HttpGet(urls[0]); 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpResponse response = httpclient.execute(httppost); 

      // StatusLine stat = response.getStatusLine(); 
      int status = response.getStatusLine().getStatusCode(); 

      if (status == 200) { 
       HttpEntity entity = response.getEntity(); 
       String data = EntityUtils.toString(entity);     

       JSONObject jsono = new JSONObject(data);      
       JSONArray jarray = jsono.getJSONArray("drivers");     
       if(jarray.length()!=0){ 
        for (int i = 0; i < jarray.length(); i++) {      
         JSONObject object = jarray.getJSONObject(i);      
         Drivers driver = new Drivers();  
         driver.setPhone(object.getString("phone")); 
         driver.setName(object.getString("emp_name")); 
         driverList.add(driver);        
        }      
       }else{ 
        driver = new Drivers();  
        driver.setPhone(" "); 
        driver.setName(" No Driver Place yet"); 
        driverList.add(driver); 
       } 
       return true; 
      } 

     } catch (ParseException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 

    protected void onPostExecute(Boolean result) { 
     dialog.cancel(); 
     btback.setVisibility(View.VISIBLE); 
     dadapter.notifyDataSetChanged(); 
     if(result == false) 
      Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 

    } 
} 

}

公共类驱动程序{

private String name; 
private String phone; 

public Drivers() { 

} 

public Drivers(String name, String phone) { 
    super(); 
    this.name = name; 
    this.phone = phone; 

} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getPhone() { 
    return phone; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 

}

+0

你是什么意思的搜索(过滤器)不工作良好。 ..is是否正常工作 –

+0

此代码的输出是什么? – Jas

+0

输出很好,它显示完整的结果集,但是当我尝试过滤名称时没有输出,也没有错误。 (非常好地显示完整列表) – Vinay

回答

0

实际上它不会过滤,因为您清除了driverList,然后在else语句中循环到已经为空的driverList。您唯一可以做的是为driversList创建一个备份列表,然后使用备份列表获取所有要过滤到driverList的数据。

例子这里:

// here is the backuplist 
ArrayList<Drivers> backupList = new ArrayList<Drivers>(); 
    // Filter Class  
public void filter(String charText) { 
    charText = charText.toLowerCase(Locale.getDefault()); 
    // actually its easy to just clear the backup list 
    // but due to reasons where users press backspace you have to load backup list only once 
    if(backupList.isEmpty()) { 
     backupList.addAll(driverList); 
    } 
    driverList.clear(); 
    if (charText.length() == 0) { 
     driverList.addAll(backupList); 
    } else { 
     for (Drivers driver : backupList) { 
      if (driver.getName().toLowerCase(Locale.getDefault()).contains(charText)) { 
       driverList.add(driver); 
      } 
     } 
    } 
    notifyDataSetChanged(); 
} 

希望它能帮助:)

+0

感谢它现在的作品 – Vinay

+0

哦,这很好,你会接受这个答案,如果它可以帮助你吗? :) – Spurdow

相关问题