Android 使用onTextChanged将JSON结果填充到GridView

Android 使用onTextChanged将JSON结果填充到GridView,android,json,gridview,Android,Json,Gridview,您好,关于如何使用onTextChange填充JSON结果,我有点问题 我试图做的是在特定EditText上的文本发生更改时更新GridView的内容 以下是我迄今为止所做的工作: main活动 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_people)

您好,关于如何使用onTextChange填充JSON结果,我有点问题

我试图做的是在特定EditText上的文本发生更改时更新GridView的内容

以下是我迄今为止所做的工作:

main活动

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_people);

    /* INITIALIZES GRID ITEMS */
    gridView.setAdapter(new SearchGridAdapter(this));
    gridView.setOnItemClickListener(new OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub;
        }
    });

    TextWatcher fieldValidator = new TextWatcher(){

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub
            if(longEnough()){
                doSearch(txtSearchPpl.getText().toString().trim());
            }
        }

        private boolean longEnough() {
            return txtSearchPpl.getText().toString().trim().length() > 3;
        }
    };

    txtSearchPpl.addTextChangedListener(fieldValidator);

private void doSearch(String keywords){
    SearchPerson task = new SearchPerson();
    task.execute(keywords);
}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u search\u people);
/*初始化网格项*/
setAdapter(新的SearchGridAdapter(this));
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父视图、视图、整型位置、,
长id){
//TODO自动生成方法存根;
}
});
TextWatcher fieldValidator=新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列,int start,int before,
整数计数){
//TODO自动生成的方法存根
如果(足够长()){
doSearch(txtsearchpl.getText().toString().trim());
}
}
私有布尔足够长(){
返回txtsearchpl.getText().toString().trim().length()>3;
}
};
txtSearchPpl.addTextChangedListener(fieldValidator);
私有void doSearch(字符串关键字){
SearchPerson任务=新建SearchPerson();
任务执行(关键字);
}
而我的适配器如下所示:

public class SearchGridAdapter extends ArrayAdapter<Person> {

public SearchGridAdapter(Context context){
    super(context, R.layout.grid_item_text);
    mContext = context;
    mPeople = null;
}

public SearchGridAdapter(Context context, ArrayList<Person> people){
    super(context, R.layout.grid_item_text);
    mContext = context;
    mPeople = people;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    if (mPeople == null){
        return 0;
    }else{
        return mPeople.size();
    }

}

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

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

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

    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View view = inflater.inflate(R.layout.grid_item_text,
            parent, false);

    TextView personName = (TextView) view.findViewById(R.id.textItem);
    ImageView personThumb = (ImageView) view.findViewById(R.id.iconItem);

    personName.setText(mPeople.get(position).fullName);
    personThumb.setImageResource(mThumbs);
    return view;
}
公共类SearchGridAdapter扩展了ArrayAdapter{
公共SearchGridAdapter(上下文){
超级(上下文、右布局、网格项和文本);
mContext=上下文;
mPeople=null;
}
公共SearchGridAdapter(上下文,ArrayList人员){
超级(上下文、右布局、网格项和文本);
mContext=上下文;
人民=人民;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
if(mPeople==null){
返回0;
}否则{
返回mPeople.size();
}
}
@凌驾
公众人物getItem(内部职位){
//TODO自动生成的方法存根
返回mPeople.get(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
LayoutFlater充气器=(LayoutFlater)mContext
.getSystemService(上下文布局\充气机\服务);
视图=充气机。充气(R.layout.grid\u item\u text,
父母,假);
TextView personName=(TextView)view.findViewById(R.id.textItem);
ImageView personTumb=(ImageView)view.findViewById(R.id.iconItem);
personName.setText(mPeople.get(position.fullName));
personThumb.setImageResource(mThumbs);
返回视图;
}
}

而onPostExecute是这样做的:

*** REST OF CODE OMITTED ***
    @Override
    protected void onPostExecute(final ArrayList<Person> result) {         
        runOnUiThread(new Runnable() {
            public void run() {
                if(result != null){
                    gridView.setAdapter(new SearchGridAdapter(getApplicationContext(), result));
                }
            }
        });
    }
***其余代码被省略***
@凌驾
受保护的void onPostExecute(最终ArrayList结果){
runOnUiThread(新的Runnable(){
公开募捐{
如果(结果!=null){
setAdapter(新的SearchGridAdapter(getApplicationContext(),result));
}
}
});
}
上面的代码可以工作,但会引发一些意外行为。如果我第一次键入“Ruby”,它会正确显示结果,但是当我继续键入“Ruby Palmer”时,活动崩溃(应用程序仍在运行)

有人能给我指一下这里的正确方向吗?谢谢

编辑#1:

我删除了onUiThread,它给了我以下错误:

致命异常:AsyncTask#4 位于x.x.x.SearchPeopleActivity$SearchPerson.doInBackground(SearchPeopleActivity.java:231)

编辑#2:

我在EDIT#1上发现了错误,现在我在doInBackground()上实现了一个简单的if检查

@覆盖
受保护的ArrayList doInBackground(字符串…参数){
//TODO自动生成的方法存根
字符串关键字=参数[0];
字符串resultData=((新的HttpRetriever()).searchPerson(myAccount.email,myAccount.passwd,关键字);
Log.i(“THUMBQOO”,resultData);
试一试{
if(resultData!=null){
mSearchResult=(新的ContactHandlers()).personResult(resultData);
}否则{
mSearchResult=null;
}
}捕获(JSONException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
Log.e(“THUMBQOO-REG电话”,“JSON异常”);
}
返回结果;
}

但是,最初的问题仍然存在。当我键入“Ruby”时,网格显示所有名称都包含Ruby。但是,如果我继续键入Ruby Pal,活动将崩溃(应用程序仍在运行)。并重置没有项目的GridView。

@svenoaks感谢您的建议。它按我所希望的方式工作。后一个问题是由于URI生成器不正确

所以基本上我就是这么做的(删除onUiThread)

@覆盖
受保护的void onPostExecute(最终ArrayList结果){
如果(结果!=null){
setAdapter(新的SearchGridAdapter(getApplicationContext(),result));
}
}

在onPostExecute中删除RunnuiThread,它已在UI线程上调用,并导致它立即在UI线程上运行,而不是放入队列,这可能会导致您的问题。LogCat在崩溃时会说什么,发布它。您好,我确实删除了RunnuiThread,现在应用程序正在崩溃。有关Log Cat错误,请参阅编辑#1。
@Override
protected ArrayList<Person> doInBackground(String... params) {
    // TODO Auto-generated method stub
    String keyword = params[0];
    String resultData = ((new HttpRetriever())).searchPerson(myAccount.email, myAccount.passwd, keyword);
    Log.i("THUMBQOO", resultData);
    try {
        if(resultData != null){
            mSearchResult = (new ContactHandlers()).personResult(resultData);
        }else{
            mSearchResult = null;
        }
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.e("THUMBQOO - REG PHONE", "JSON Exception");
    }
    return mSearchResult;
}
    @Override
    protected void onPostExecute(final ArrayList<Person> result) {  
        if(result != null){
            gridView.setAdapter(new SearchGridAdapter(getApplicationContext(), result));
        }
    }