Java 通过XMLParsing onTextChange自动完成TextView

Java 通过XMLParsing onTextChange自动完成TextView,java,xml-parsing,sax,autocompletetextview,Java,Xml Parsing,Sax,Autocompletetextview,我有这个问题。我需要向我的SAX解析器发送一个调用(每次用户尝试输入学生的姓名时)以获取姓名。我现在正在做的是向我的HttpHandler发送一个令牌字符串,它每次返回10条记录,因为学生总数约为40K,所以我无法一次解析所有记录。我正在调用AsyncTask以在AutoCompletetextview的ContextChanged事件中解析XML。但我仍然无法将适配器设置为自动完成 public ArrayList<AutoCompleteUserDataGetterSetter>

我有这个问题。我需要向我的SAX解析器发送一个调用(每次用户尝试输入学生的姓名时)以获取姓名。我现在正在做的是向我的HttpHandler发送一个令牌字符串,它每次返回10条记录,因为学生总数约为40K,所以我无法一次解析所有记录。我正在调用AsyncTask以在AutoCompletetextview的ContextChanged事件中解析XML。但我仍然无法将适配器设置为自动完成

 public ArrayList<AutoCompleteUserDataGetterSetter> parsexml(String token)
    {
         try {

                SAXParserFactory saxPF = SAXParserFactory.newInstance();



                SAXParser saxP = saxPF.newSAXParser();
                XMLReader xmlR = saxP.getXMLReader();


                URL url = new URL(xyz.com/xyz.ashx?token=+"token"); // URL of the XML


                AutoCompleteUserDataXMLHandler myXMLHandler = new AutoCompleteUserDataXMLHandler();
                xmlR.setContentHandler(myXMLHandler);
                xmlR.parse(new InputSource(url.openStream()));

            } catch (Exception e) {
                System.out.println(e);
            }

            return data=AutoCompleteUserDataXMLHandler.getArrayData();


    }
public ArrayList parsexml(字符串标记)
{
试一试{
SAXParserFactory saxPF=SAXParserFactory.newInstance();
SAXParser saxP=saxPF.newSAXParser();
XMLReader xmlR=saxP.getXMLReader();
URL URL=newURL(xyz.com/xyz.ashx?token=+“token”);//XML的URL
AutoCompleteUserDataXMLHandler myXMLHandler=新的AutoCompleteUserDataXMLHandler();
setContentHandler(myXMLHandler);
parse(新的InputSource(url.openStream());
}捕获(例外e){
系统输出打印ln(e);
}
返回数据=autocompleteServataXMLHandler.getArrayData();
}
这是我的AutoCompleteTextViewAdapter代码

ArrayList<AutoCompleteUserDataGetterSetter> data=new ArrayList<AutoCompleteUserDataGetterSetter>();

public UserNewMessageAutoCompleteAdapater(Context context,
        int textViewResourceId,
        ArrayList<AutoCompleteUserDataGetterSetter>data) {
    super(context, textViewResourceId, data);
    // TODO Auto-generated constructor stub

       this.context = context;
        this.data=data;


        vi = (LayoutInflater) context
               .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}



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

    final AutoCompleteUserDataGetterSetter i = this.data.get(position);
    if (i != null) {
        Log.d("adapter", "in here");
        AutoCompleteUserDataGetterSetter si = (AutoCompleteUserDataGetterSetter) i;
        v = vi.inflate(R.layout.autocompletetext_layout, null);
        final TextView title = (TextView) v
                .findViewById(R.id.autocomplete_name);
        TextView userid = (TextView) v
        .findViewById(R.id.autocompleteuserid);
        if (title != null)
            title.setText(si.GetFullName());
        userid.setText(si.GetUserId());
    }

    return v;
}

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

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

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return 0;
}
ArrayList data=new ArrayList();
public usernewmessageautocompletedapter(上下文,
int textViewResourceId,
ArrayListdata){
super(上下文、textViewResourceId、数据);
//TODO自动生成的构造函数存根
this.context=上下文;
这个。数据=数据;
vi=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
最终自动完成SerDataGetterSetter i=this.data.get(位置);
如果(i!=null){
Log.d(“适配器”,“在这里”);
AutoCompleteTUserDataGettersetter si=(AutoCompleteTUserDataGettersetter)i;
v=vi.充气(R.layout.autocompletetext\u布局,空);
最终文本视图标题=(文本视图)v
.findviewbyd(R.id.autocomplete_name);
TextView用户ID=(TextView)v
.findViewById(R.id.autocompleteSerid);
如果(标题!=null)
title.setText(si.GetFullName());
userid.setText(si.GetUserId());
}
返回v;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回data.size();
}
@凌驾
公共自动完成serdatagettersetter getItem(int arg0){
//TODO自动生成的方法存根
返回data.get(arg0);
}
@凌驾
公共长getItemId(int arg0){
//TODO自动生成的方法存根
返回0;
}
这是我的AsyncTask类

class SomeTask extends AsyncTask<Void, Void, Void> {

    private final ProgressDialog dialog = new ProgressDialog(UserMessagesComposeNewActivity.this);

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected Void doInBackground(Void... voids) {

        UserMessagesComposeNewActivity.this.data=parsexml(users.getText().toString());

     for(int i=0;i<data.size();i++)
     {
        nameadapter.add(data.get(i).GetFullName());
     useridadapter.add(data.get(i).GetUserId());
     }

if(data==null)
{
   AutoCompleteUserDataGetterSetter umsgs=new AutoCompleteUserDataGetterSetter();
   umsgs.SetFullName(" ");
   umsgs.SetUserID("");
  data.add(umsgs);

}

return null;
    }
    @Override
    protected void onPostExecute(Void aVoid) {
         if (this.dialog.isShowing()) {



             this.dialog.dismiss();

          }
                users.setAdapter(nameadapter);



    }
}
class SomeTask扩展了AsyncTask{
private final ProgressDialog dialog=新建ProgressDialog(userMessagesComposeneActivity.this);
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的空位背景(空位…空位){
userMessagesComposeneActivity.this.data=parsexml(users.getText().toString());

对于(int i=0;i最终,经过一段时间的讨论,最终解决了这个问题

我放弃了自定义适配器方法,使用了ArrayAdapter方法。下面是通过选择用户姓名向用户发送消息的完整代码

public class UserMessagesComposeNewActivity extends Activity implements TextWatcher{

    ArrayList<AutoCompleteUserDataGetterSetter> data=new    
    ArrayList<AutoCompleteUserDataGetterSetter>(); 
    Long login;
    Boolean shouldAutoComplete;
    UserNewMessageAutoCompleteAdapater cdapater;
    String TO,FROM;
    Button btn;
    AutoCompleteTextView users;
    EditText edTextSubject,edTextMessage;
    AutoCompleteWidget myAutoComplete;
    List<String> nameadapter=new ArrayList<String>();
    ArrayAdapter<String> dataAdapter ;
    UserNewMessageAutoCompleteAdapater atAdapter;
    String ResultEmail;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent=getIntent();
        setContentView(R.layout.user_messages_compose_new);
        login=intent.getLongExtra("EmployeedId", 0);

        btn=(Button)findViewById(R.id.userNewmessageSendButton);
        edTextSubject=(EditText)findViewById(R.id.userNewmessageSubject);
        edTextMessage=(EditText)findViewById(R.id.userNewmessageMessage);
        users=(AutoCompleteTextView)findViewById(R.id.userNewmessageAutoCT);
        users.addTextChangedListener(this);
        users.setThreshold(4);



            //Here we get the selected value from autocompletetextview dropdown
            users.setOnClickListener(new OnClickListener() {

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

            for(int i=0;i<data.size();i++)
            {
                if(data.get(i).GetFullName().equals(users.getText().toString()))
                {
                    TO=data.get(i).GetUserId();
                }
                else
                {
                    TO="0";
                }
            }

        }
    });


       //here we call the Send Email method.
       btn.setOnClickListener(new OnClickListener() {

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

                new DomParserEmail().execute();

            }
        });





    }

        public void afterTextChanged(Editable s) {



        }


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

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        if(s.length()>=4)
        {
         new SomeTask().execute();

        }


    }


    class SomeTask extends AsyncTask<Void, Void, Void> {

        private final ProgressDialog dialog = new ProgressDialog(UserMessagesComposeNewActivity.this);

        @Override
        protected void onPreExecute() {

        }

        @Override
        protected Void doInBackground(Void... voids) {

            //Here we are parsing the xml
            UserMessagesComposeNewActivity.this.data=parsexml(users.getText().toString());



    if(data==null)
    {
       AutoCompleteUserDataGetterSetter umsgs=new AutoCompleteUserDataGetterSetter();
       umsgs.SetFullName(" ");
       umsgs.SetUserID("");
      data.add(umsgs);

    }

    return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
             if (this.dialog.isShowing()) {



                 this.dialog.dismiss();

             }

            UserMessagesComposeNewActivity.this.nameadapter.clear();
             for(int i=0;i<data.size();i++)
             {

      UserMessagesComposeNewActivity.this.nameadapter.add(UserMessagesComposeNewActivity.this.data.get(i).GetFullName());

             }

             dataAdapter = new ArrayAdapter<String>(getApplicationContext(),
             android.R.layout.simple_dropdown_item_1line, nameadapter);
             dataAdapter.notifyDataSetChanged();
             users.setAdapter(dataAdapter);
             users.showDropDown();


        }
    }


     public ArrayList<AutoCompleteUserDataGetterSetter> parsexml(String token)
        {
             try {

                    SAXParserFactory saxPF = SAXParserFactory.newInstance();



                    SAXParser saxP = saxPF.newSAXParser();
                    XMLReader xmlR = saxP.getXMLReader();


                    URL url = new URL("blah blah"); // URL of the XML

                    /** 
                     * Create the Handler to handle each of the XML tags. 
                     **/
                    AutoCompleteUserDataXMLHandler myXMLHandler = new AutoCompleteUserDataXMLHandler();
                    xmlR.setContentHandler(myXMLHandler);
                    xmlR.parse(new InputSource(url.openStream()));

                } catch (Exception e) {
                    System.out.println(e);
                }

                return data=AutoCompleteUserDataXMLHandler.getArrayData();


        }


     class DomParserEmail extends AsyncTask<Void, Void, Void> {

            private final ProgressDialog dialog = new ProgressDialog(UserMessagesComposeNewActivity.this);
            @Override
            protected void onPreExecute() {
                  this.dialog.setMessage("Sending your message");
                  this.dialog.setTitle("Please Wait");
                  this.dialog.show();
            }

            @Override
            protected Void doInBackground(Void... voids) {
              // download and parse

                UserMessagesComposeNewActivity.this.ResultEmail=EmailSuccessMessage(UserMessagesComposeNewActivity.this.edTextSubject.getText().toString(),UserMessagesComposeNewActivity.this.edTextMessage.getText().toString(),UserMessagesComposeNewActivity.this.TO,UserMessagesComposeNewActivity.this.login.toString());

                return null;
            }
            @Override
            protected void onPostExecute(Void aVoid) {
                 if (this.dialog.isShowing()) {
                     this.dialog.dismiss();
                    Toast toast=Toast.makeText(getApplicationContext(),UserMessagesComposeNewActivity.this.ResultEmail,Toast.LENGTH_LONG );
                    toast.show();
         }
        }
        }

        public String EmailSuccessMessage(String subject,String content,String To, String From) throws FactoryConfigurationError
        {




             try {

                SAXParserFactory saxPF = SAXParserFactory.newInstance();



                SAXParser saxP = saxPF.newSAXParser();
                XMLReader xmlR = saxP.getXMLReader();


                URL url = new URL("abc.com/abc.asahx?blah blah");

                /** 
                 * Create the Handler to handle each of the XML tags. 
                 **/
                UserReplyMessageXMLParsing myXMLHandler = new UserReplyMessageXMLParsing();
                xmlR.setContentHandler(myXMLHandler);
                xmlR.parse(new InputSource(url.openStream()));

            } 
             catch (Exception e)
             {
                System.out.println(e);
                UserMessagesComposeNewActivity.this.ResultEmail="Email Not Sent";
            }

            UserReplyMessageXMLParsing usmx=new UserReplyMessageXMLParsing();
            UserMessagesComposeNewActivity.this.ResultEmail=usmx.GetEmailStatus();

            return UserMessagesComposeNewActivity.this.ResultEmail;

        }
}
公共类UserMessagesComposeneActivity扩展活动实现TextWatcher{
ArrayList数据=新建
ArrayList();
长登录;
布尔应自动完成;
UserNewMessageAutoCompleteAdapater CDAPeter;
串到,从;
按钮btn;
自动完成文本视图用户;
EditText edTextSubject,edTextMessage;
自动完成小部件myAutoComplete;
List nameadapter=new ArrayList();
阵列适配器;
UserNewMessageAutoCompleteAdapter或Adapter;
字符串ResultEmail;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Intent=getIntent();
setContentView(R.layout.user\u messages\u compose\u new);
login=intent.getLongExtra(“EmployeedId”,0);
btn=(按钮)findViewById(R.id.userNewmessageSendButton);
edTextSubject=(EditText)findViewById(R.id.userNewmessageSubject);
edTextMessage=(EditText)findViewById(R.id.userNewmessageMessage);
users=(AutoCompleteTextView)findviewbyd(R.id.userNewmessageAutoCT);
users.addTextChangedListener(此);
设置阈值(4);
//这里我们从autocompletetextview下拉列表中获取所选值
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
对于(int i=0;i=4)
{
新建SomeTask().execute();
}
}
类SomeTask扩展了AsyncTask{
private final ProgressDialog dialog=新建ProgressDialog(userMessagesComposeneActivity.this);
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的空位背景(空位…空位){
//这里我们正在解析xml
userMessagesComposeneActivity.this.data=parsexml(users.getText().toString());
如果(数据==null)
{
autocompleteeserdatagettersetter umsgs=新的autocompleteeserdatagettersetter();
umsgs.SetFullName(“”);
umsgs.SetUserID(“”);
添加数据(umsgs);
}
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
if(this.dialog.isShowing()){
this.dialog.disclose();
}
UserMessagesComposeneActivity.this.nameadapter.clear();
对于(int i=0;i