自定义适配器中的Looper.prepare()异常

时间:2013-06-25 06:02:47

标签: android android-adapter

我在Asynctask的doInBackground方法中得到了异常。我正在使用自定义适配器并执行过滤我想在Asycntask中执行此过滤,代码在没有Asynctask的情况下运行完美,但执行过滤需要3到4秒。这就是我想使用Asynctask的原因。 这是我的代码......

public FarmerAdapter(Context context, int textViewResourceId,
        List<Farmer> objects) {
    super(context, textViewResourceId, objects);

    this.items = (ArrayList<Farmer>) objects;
    this.itemsAll = (ArrayList<Farmer>) items.clone();
    this.suggestions = new ArrayList<Farmer>();
    this.CurrentContext = context;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if ((this.items == null) || (position + 1 > this.items.size()))
        return convertView;

    this.CurrentItem = ((Farmer) this.items.get(position));

    LayoutInflater vi = (LayoutInflater) CurrentContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = vi.inflate(R.layout.farmer_list_adapter, null);

    TextView name = (TextView) convertView
            .findViewById(R.id.farmer_list_name);
    TextView fname = (TextView) convertView
            .findViewById(R.id.farmer_list_fname);
    TextView cnic = (TextView) convertView
            .findViewById(R.id.farmer_list_cnic);

    name.setText(this.CurrentItem.getFarmerName());
    fname.setText(this.CurrentItem.getFarmerFatherName());
    cnic.setText("" + this.CurrentItem.getFarmerCNIC());

    return convertView;
}

public Filter getFilter() {

    backgroundTask = new AsyncTask<Void, Void, Void>() {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.e("AsynTask", " Started");
        }

        @Override
        protected Void doInBackground(Void... params) {
            nameFilter = new Filter() {

                public String convertResultToString(Object resultValue) {
                    String str = ((Farmer) (resultValue)).getFarmerName();
                    return str;
                }

                @Override
                protected void publishResults(CharSequence constraint,
                        FilterResults results) {

                    ArrayList<Farmer> filteredList = (ArrayList<Farmer>) results.values;
                    ArrayList<Farmer> farmerList = new ArrayList<Farmer>();
                    if (results != null && results.count > 0) {
                        clear();
                        for (Farmer f : filteredList) {
                            farmerList.add(f);
                        }
                        Iterator<Farmer> customerIterator = farmerList.iterator();
                        while (customerIterator.hasNext()) {
                            Farmer fiterator = customerIterator.next();
                            add(fiterator);
                        }
                        notifyDataSetChanged();
                    }
                }

                @Override
                protected FilterResults performFiltering(CharSequence constraint) {

                    if (constraint != null) {
                        suggestions.clear();
                        for (Farmer farmer : itemsAll) {
                            if (farmer.getFarmerName().toLowerCase()
                                    .startsWith(constraint.toString().toLowerCase())) {
                                suggestions.add(farmer);
                            }
                        }
                        FilterResults filterResults = new FilterResults();
                        filterResults.values = suggestions;
                        filterResults.count = suggestions.size();
                        return filterResults;
                    } else {
                        return new FilterResults();
                    }
                }

            };


            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Log.e("AsynTask", " Ended");
        }

    }.execute();

    return nameFilter;
};

请帮我解决这个问题。

3 个答案:

答案 0 :(得分:1)

尝试在onPostExecute()中移动notifyDataSetChanged(),因为更改UI的方法应该在主UI线程中运行。

答案 1 :(得分:1)

您无法更新 doInBackground()方法中的任何用户界面更改。

使用 onPostExecute()方法更新任何用户界面更改。

onPostExecute将在doInBackground方法之后调用。

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        notifyDataSetChanged();
        Log.e("AsynTask", " Ended");
    }

答案 2 :(得分:1)

只需删除Asycntask并直接在performFiltering中完成工作。

我认为增加一个级别的复杂性会加快你的搜索速度