如何在BaseAdapter实现用getFilter()(how to implement getF

2019-09-29 18:34发布

在我的应用我从数据库中获取数据,并显示项目ListView 。 我要为ListView的项目执行搜索选项。 我从获取项目BaseAdapter 。 如何实现getFilter()定制BaseAdapter 。 这里是我的活动

public class BindTenGPS extends Activity {
    private MenuItem menuItem;
    DbaAdapter db;
    private ProgressDialog progressDialog;
    ListView listView ;
    EditText inputSearch;
    private  BindTenDeviceBaseAdapter adapter;
    List<RowTenDevice> rowTenDevice;
    ArrayList<String> DeviceName = new ArrayList<String>();

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.list1_main);
         inputSearch = (EditText)findViewById(R.id.inputSearch);
         db=new DbaAdapter(getApplicationContext());


         new LoadTrackNumbers().execute();

     }

     private class LoadTrackNumbers extends AsyncTask<Void, Integer, Void> {
            int myProgress;
            @Override  
            protected void onPreExecute()  
            {  
                //Create a new progress dialog  
                progressDialog = new ProgressDialog(BindTenGPS.this);  
                //Set the progress dialog to display a horizontal progress bar  
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
                //Set the dialog title to 'Loading...'  
                progressDialog.setTitle("Loading...");  
                //Set the dialog message to 'Loading application View, please wait...'  
                progressDialog.setMessage("Loading application View, please wait...");  
                //This dialog can't be canceled by pressing the back key  
                progressDialog.setCancelable(true);  
                //This dialog isn't indeterminate  
                progressDialog.setIndeterminate(false);  
                //The maximum number of items is 100  
                progressDialog.setMax(100);  
                //Set the current progress to zero  
                progressDialog.setProgress(0);  
                //Display the progress dialog  
                progressDialog.show(); 

            }
            @Override
            protected Void doInBackground(Void... params) {
                try  
                {  
                    //Get the current thread's token  
                    synchronized (this)  
                    { 
                        DeviceName.clear();
                        publishProgress(10);
                        this.wait(500);
                        Connection conn = null;
                        try {
                            Log.w("Error connection","shyam1");
                        String driver = "net.sourceforge.jtds.jdbc.Driver";
                        Log.w("Error connection","shyam2");
                        Log.i("Android"," MySQL Connect Example0.");
                        Class.forName(driver).newInstance();
                        Log.w("Error connection","shyam3");
                        String connString = "jdbc:jtds:sqlserver://ip address;instance=SQLEXPRESS;DatabaseName=AAUMConnect;";
                        String username = "username";
                        String password = "password";
                        Log.w("Error connection","shyam4");
                        publishProgress(20);
                        this.wait(500);
                        publishProgress(30);
                        this.wait(500);
                        publishProgress(40);
                        this.wait(500);
                        publishProgress(50);
                        this.wait(500);
                        conn = DriverManager.getConnection(connString,username,password);
                        publishProgress(80);
                        Log.w("Error connection","shyam5");
                        Statement stmt = conn.createStatement();
                        ResultSet reset;
                        db.open();
                        int superuser = db.GetISSuperUser();
                        db.close();
                        db.open();
                        int clientid = db.GetClientID();
                        db.close();
                        if(superuser == 0)
                        {
                            db.open();
                            String branch = db.GetBranch();
                            db.close();
                            reset = stmt.executeQuery("SELECT dbo.fn_AddEveryNthItem(LEFT(AssignVehicleToTrackTable, LEN(AssignVehicleToTrackTable) - 1), ',','@', 1) AS DeviceName FROM (SELECT DeviceName + ',' FROM AssignVehicleToTrack where ClientID = " + clientid + " and BranchName = '" + branch.trim() + "' and VirtualNo = 'GPS' order by DeviceName FOR XML PATH ('')) T1 (AssignVehicleToTrackTable)");
                        }
                        else
                        {
                            reset = stmt.executeQuery("SELECT dbo.fn_AddEveryNthItem(LEFT(AssignVehicleToTrackTable, LEN(AssignVehicleToTrackTable) - 1), ',','@', 1) AS DeviceName FROM (SELECT DeviceName + ',' FROM AssignVehicleToTrack where ClientID = " + clientid + " and VirtualNo = 'GPS' order by DeviceName FOR XML PATH ('')) T1 (AssignVehicleToTrackTable)");
                        }

                        //Print the data to the console
                        Log.w("Error connection","shyam6");
                        int i1 = 0, c = 0;
                         try
                         {
                             while(reset.next()){
                                    publishProgress(c);
                                    String[] tokens = new String[100];
                                    tokens = reset.getString(1).split("@");
                                    for(int i=0;i<tokens.length;i++)
                                    {
                                        DeviceName.add(tokens[i].substring(1));
                                    }
                                    i1++;
                                    c+=10;
                                }
                         }
                         catch(Exception ex)
                         {
                             runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(getApplicationContext(), "GPS Device not available", Toast.LENGTH_LONG).show();
                                    }
                               });
                         }

                        reset.close();
                        conn.close();
                        rowTenDevice = new ArrayList<RowTenDevice>();
                        for (int j = 0; j < DeviceName.size(); j++) {
                            RowTenDevice item = new RowTenDevice(DeviceName.get(j));
                            Log.w("Data:","D"+j+" : "+DeviceName.get(j));
                            rowTenDevice.add(item);
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                listView = (ListView) findViewById(R.id.list);
                                Log.w("Data:","E1");
                                adapter = new BindTenDeviceBaseAdapter(BindTenGPS.this, rowTenDevice);
                                Log.w("Data:","E2");
                                listView.setAdapter(adapter);
                                Log.w("Data:","E3");

                                inputSearch.addTextChangedListener(new TextWatcher() {


                                    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                                        // When user changed the Text
                                        BindTenGPS.this.adapter.getFilter().filter(cs);   
                                    }


                                    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                            int arg3) {
                                        // TODO Auto-generated method stub

                                    }

                                    @Override
                                    public void afterTextChanged(Editable arg0) {
                                        // TODO Auto-generated method stub                          
                                    }
                                });
                                listView.setOnItemClickListener(new OnItemClickListener() {

                                    @Override
                                    public void onItemClick(
                                            AdapterView<?> arg0, View arg1,
                                            int position, long arg3) {
                                        // TODO Auto-generated method stub
                                        Intent intent = new Intent(BindTenGPS.this, ShowGPS.class);
                                        intent.putExtra("DeviceList", rowTenDevice.get(position).getDeviceName());

                                        startActivity(intent);
                                    }

                                });
                                Log.w("Data:","E4");


                           }
                       });

                        } catch (Exception e)
                        {
                            Log.w("Error connection","shyam" + e.getMessage());
                            e.printStackTrace();
                        }
                        this.wait(500);
                        publishProgress(100);
                    }  
                }  
                catch (Exception e)  
                {  
                    e.printStackTrace();  
                }  
                return null;
            }
            @Override  
            protected void onProgressUpdate(Integer... values)  
            {  
                //set the current progress of the progress dialog  
                progressDialog.setProgress(values[0]);  
            }  
            //after executing the code in the thread  
            @Override
            protected void onPostExecute(Void result)  
            {  
                //close the progress dialog  
                progressDialog.dismiss();
                //initialize the View  
                //setContentView(R.layout.list1_main);  
            }
        }

}

BindTenDeviceBaseAdapter

编辑2:我已经编辑我的基地adapter.now它在抛出错误if(data.toLowerCase().startsWith(constraint.toString()))
误差The method toLowerCase() is undefined for the type RowTenDevice 。 我使用RowTenDevice类加载String..so我如何工作的呢?

public class BindTenDeviceBaseAdapter extends BaseAdapter implements Filterable {
    Context context;
    List<RowTenDevice> rowTenDevice;
    List<RowTenDevice> arrayList; 
    LayoutInflater inflater;

    public BindTenDeviceBaseAdapter(Context context, List<RowTenDevice> items) {
        this.context = context;
        this.rowTenDevice = items;
        this.arrayList = items;
        inflater = LayoutInflater.from(context);

    }

    /*private view holder class*/
    private class ViewHolder {

        TextView txtTenDevice;
    }


    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        //return rowTenDevice.size();
        return arrayList.size();
    }

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

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return rowTenDevice.indexOf(getItem(position));
    }

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

        ViewHolder holder = null;

        LayoutInflater mInflater = (LayoutInflater)
            context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_tendevice, null);
            holder = new ViewHolder();
            holder.txtTenDevice = (TextView) convertView.findViewById(R.id.tvTenDevice);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        RowTenDevice rowItem = (RowTenDevice) getItem(position);

        holder.txtTenDevice.setText(rowItem.getDeviceName());
        return convertView;
    }

    @Override
    public Filter getFilter() {
        // TODO Auto-generated method stub
         Filter filter = new Filter() {

             @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
                    // TODO Auto-generated method stub
                      arrayList = (List<RowTenDevice>) results.values; // has the filtered values
                      notifyDataSetChanged();
                }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                // TODO Auto-generated method stub
                FilterResults results = new FilterResults();
                List<RowTenDevice> FilteredArrList = new ArrayList<RowTenDevice>();

                if (rowTenDevice == null) {
                    rowTenDevice = new ArrayList<RowTenDevice>(arrayList); // saves the original data in mOriginalValues
                }
                 if (constraint == null || constraint.length() == 0) {

                     // set the Original result to return  
                     results.count = rowTenDevice.size();
                     results.values = rowTenDevice;
                 } else {
                     constraint = constraint.toString().toLowerCase();
                     for (int i = 0; i < rowTenDevice.size(); i++) {
                         RowTenDevice data = rowTenDevice.get(i);
                         if (data.toLowerCase().startsWith(constraint.toString())) {
                             FilteredArrList.add(data);
                         }
                     }
                     // set the Filtered result to return
                     results.count = FilteredArrList.size();
                     results.values = FilteredArrList;
                 }
                 return results;
             }


    };
        return filter;


    }
}

RowTenDevice

public class RowTenDevice {
    private String devicename;
    public RowTenDevice(String devicename) {
        this.devicename = devicename;
    }
    public String getDeviceName() {
        return devicename;
    }
    public void setDeviceName(String devicename) {
        this.devicename = devicename;
    }
}

我知道这个问题已经被问了好几次,但没有一个解决方案为我工作。

Answer 1:

使用(如果你确定数据和设备名称都是不为空)

if(data.getDeviceName().toLowerCase().startsWith(constraint.toString()))

代替

   if(data.toLowerCase().startsWith(constraint.toString()))

此外,检查此可能的问题和答案。 题



文章来源: how to implement getFilter() on a BaseAdapter