使用另一个类的适配器

时间:2017-03-23 19:34:41

标签: android

我想使用另一个类的适配器。但显然有一些问题,因为当我在搜索栏中输入一个应用程序崩溃的值时,日志会显示:

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

1 个答案:

答案 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();
}