您好我有一点问题如何使用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。
得到onPostExecute摆脱runOnUiThread的,它已经称为UI线程上,并使其立即在UI线程上运行而不是排队,这可能会导致你的问题。 –
LogCat在崩溃时会说什么,发布它。 –
嗨,我确实删除了runOnUiThread,现在应用程序崩溃了。有关Log Cat Error的信息,请参阅编辑#1。 – Jeremy