2013-11-29 39 views
0

您好我有一点问题如何使用onTextChange填充JSON结果。使用onTextChanged填充JSON结果到GridView

我想要做的是每当特定EditText上的文本被更改时更新我的​​GridView的内容。

以下是我迄今所做的:

MainActivity

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); 
} 

虽然我的适配器看起来像这样

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; 
} 

}

而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)); 
       } 
      } 
     }); 
    } 

上面的代码工作,但它会抛出一些无意的行为。如果我第一次输入“Ruby”,它会正确显示结果,但是当我继续输入“Ruby Palmer”时,活动崩溃了(应用程序仍在运行)。

任何人都可以指出我正确的方向吗?谢谢。

编辑#1:

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

致命异常:#的AsyncTask 4 在xxxSearchPeopleActivity $ SearchPerson.doInBackground(SearchPeopleActivity.java:231)

EDIT#2:

我想出上EDIT#1的错误,现在我实现一个简单的,如果上doInBackground)检查(

@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; 
} 

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

+0

得到onPostExecute摆脱runOnUiThread的,它已经称为UI线程上,并使其立即在UI线程上运行而不是排队,这可能会导致你的问题。 –

+0

LogCat在崩溃时会说什么,发布它。 –

+0

嗨,我确实删除了runOnUiThread,现在应用程序崩溃了。有关Log Cat Error的信息,请参阅编辑#1。 – Jeremy

回答

0

@svenoaks感谢您的建议。它按我希望的那样工作。后面的问题是由于不正确的URI生成器。

所以基本上这是我做过什么(去除onUiThread)

@Override 
    protected void onPostExecute(final ArrayList<Person> result) { 
     if(result != null){ 
      gridView.setAdapter(new SearchGridAdapter(getApplicationContext(), result)); 
     } 
    }