我想使用另一个类的适配器。但显然有一些问题,因为当我在搜索栏中输入一个应用程序崩溃的值时,日志会显示:
lang.NullPointerException: Attempt to invoke virtual method 'android.widget.Filter android.widget.ArrayAdapter.getFilter()' on a null object reference
这是我想在onQueryTextChange方法中使用适配器的代码:
public class FindSkill extends AppCompatActivity {
ArrayAdapter myAdapter;
@Override
public boolean onQueryTextChange(String query) {
Parser parser = new Parser(FindSkill.this, data, listView);
myAdapter = (ArrayAdapter) parser.listView.getAdapter();
myAdapter.getFilter().filter(query.toString());
myAdapter.notifyDataSetChanged();
return false;
}
Parser类代码:
public class Parser extends AsyncTask <Void, Void,Integer> {
Context ctx;
ListView listView;
String data;
ArrayList<String> titles = new ArrayList<>();
public Parser(Context ctx, String data, ListView listView) {
this.ctx = ctx;
this.data=data;
this.listView = listView;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Integer doInBackground(Void... params) {
return this.parse();
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
if (integer == 1) {
ArrayAdapter adapter = new ArrayAdapter(ctx, android.R.layout.simple_list_item_1, titles);
listView.setAdapter(adapter);
} else {
Toast.makeText(ctx, "Unable to Parse", Toast.LENGTH_LONG).show();
}
}
private int parse() {
try {
JSONArray ja = new JSONArray(data);
JSONObject jo = null;
titles.clear();
for (int i = 0; i < ja.length(); i++) {
jo = ja.getJSONObject(i);
String title = jo.getString("post_title");
titles.add(title);
}
return 1;
} catch (JSONException e) {
return 0;
}
}
}
答案 0 :(得分:0)
试试这段代码:
myAdapter=(ArrayAdapter) parser.listView.getAdapter();
修改强>
尝试使用Interface进行回调:
创建接口类。
public interface TaskDelegate {
public void taskCompletionResult();
}
然后传入Parse类,当任务完成时调用回调方法。
Context ctx;
ListView listView;
String data;
ArrayList<String> titles = new ArrayList<>();
TaskDelegate taskDelegate;
public Parser(Context ctx, String data, ListView listView, TaskDelegate taskDelegate) {
this.ctx = ctx;
this.data=data;
this.listView = listView;
this.taskDelegate=taskDelegate;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Integer doInBackground(Void... params) {
return this.parse();
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
if (integer == 1) {
ArrayAdapter adapter = new ArrayAdapter(ctx, android.R.layout.simple_list_item_1, titles);
listView.setAdapter(adapter);
taskDelegate.taskCompletionResult();
} else {
Toast.makeText(ctx, "Unable to Parse", Toast.LENGTH_LONG).show();
}
}
.
.
.
.
然后实现接口和它
public class FindSkill extends AppCompatActivity implements TaskDelegate{
ArrayAdapter myAdapter;
Parser parser=nulll;
String qry=null;
@Override
public boolean onQueryTextChange(String query) {
qry=query;
parser = new Parser(FindSkill.this, data, listView,this);
return false;
}
public void taskCompletionResult()
{
myAdapter = (ArrayAdapter) parser.listView.getAdapter();
myAdapter.getFilter().filter(qry.toString());
myAdapter.notifyDataSetChanged();
}