Android 使用onTextChanged将JSON结果填充到GridView
您好,关于如何使用onTextChange填充JSON结果,我有点问题 我试图做的是在特定EditText上的文本发生更改时更新GridView的内容 以下是我迄今为止所做的工作: main活动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)
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));
}
}