空指针异常而做搜索功能的ListView控件随着BaseAdapter [英] NullPointer Exception While Doing Search Feature for ListView With BaseAdapter

查看:107
本文介绍了空指针异常而做搜索功能的ListView控件随着BaseAdapter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚完成了添加一个搜索功能,以我的Andr​​oid窗口小部件,通过安装的应用程序的用户的列表中搜索。我的应用程序安装很好,一切,但是当我去寻找一些应用程序的力量关闭,我得到这个错误:

 十一月10日至18日:10:49.393:E / AndroidRuntime(10901):致命异常:主要
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):显示java.lang.NullPointerException
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在com.example.awesomefilebuilderwidget.AppInfoAdapter.getCount(AppInfoAdapter.java:33)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在android.widget.AdapterView $ AdapterDataSetObserver.onChanged(AdapterView.java:778)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在android.database.DataSetObservable.notifyChanged(DataSetObservable.java:31)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在com.example.awesomefilebuilderwidget.AppInfoAdapter $ 1.publishResults(AppInfoAdapter.java:98)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在android.widget.Filter $ ResultsHandler.handleMessage(Filter.java:282)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在android.os.Handler.dispatchMessage(Handler.java:99)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在android.os.Looper.loop(Looper.java:150)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在android.app.ActivityThread.main(ActivityThread.java:4333)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在java.lang.reflect.Method.invokeNative(本机方法)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在java.lang.reflect.Method.invoke(Method.java:507)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
十一月10号至18日:10:49.393:E / AndroidRuntime(10901):在dalvik.system.NativeStart.main(本机方法)
 

下面是我的AppInfoAdapter,所以我可能会搞砸了某处沿线:

 包com.example.awesomefilebuilderwidget;

进口的java.util.ArrayList;
进口的java.util.List;

进口android.content.Context;
进口android.content.pm.ApplicationInfo;
进口android.content.pm.PackageManager;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.Filter;
进口android.widget.Filterable;
进口android.widget.ImageView;
进口android.widget.TextView;

公共类AppInfoAdapter扩展了BaseAdapter实现过滤的{
私人语境mContext;
私人列表< ApplicationInfo> mListAppInfo;
私人PackageManager mPackManager;
私人列表< ApplicationInfo> originalListAppInfo;
私人过滤器过滤;

公共AppInfoAdapter(上下文C,名单,其中,ApplicationInfo> listApp,PackageManager时){
    mContext = C;
    this.originalListAppInfo = this.mListAppInfo = listApp;
    mPackManager =时;
    }

@覆盖
公众诠释getCount将(){
    返回mListAppInfo.size();
}

@覆盖
公共对象的getItem(INT位置){
    返回mListAppInfo.get(位置);
}

@覆盖
众长getItemId(INT位置){
    返回的位置;
}

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    //获取选定的条目
    ApplicationInfo进入=(ApplicationInfo)mListAppInfo.get(位置);

    //参照convertView
    视图V = convertView;

    //膨胀,如果空的新布局
    如果(V == NULL){
        LayoutInflater充气= LayoutInflater.from(mContext);
        V = inflater.inflate(R.layout.layout_appinfo,NULL);
    }

    从布局资源//负荷控制
    ImageView的ivAppIcon =(ImageView的)v.findViewById(R.id.ivIcon);
    TextView的tvAppName =(TextView中)v.findViewById(R.id.tvName);
    TextView的tvPkgName =(TextView中)v.findViewById(R.id.tvPack);

    //设置要显示的数据
    ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager));
    tvAppName.setText(entry.loadLabel(mPackManager));
    tvPkgName.setText(entry.packageName);

    //返回查看
    返回伏;
}
@覆盖
公共过滤用getFilter(){
    如果(过滤== NULL){
        过滤器=新的过滤器(){
            @覆盖
            保护FilterResults performFiltering(CharSequence的约束){
                FilterResults结果=新FilterResults();
                名单< ApplicationInfo> myFilteredAppList =新的ArrayList< ApplicationInfo>();
                约束= constraint.toString()与toLowerCase()。

                对于(ApplicationInfo APPINFO:originalListAppInfo){
                    字符串somefield = appInfo.name;
                    如果(somefield.toLowerCase()。包含(constraint.toString())){
                        myFilteredAppList.add(APPINFO);
                    }
                }
                results.count = myFilteredAppList.size();
                results.values​​ = myFilteredAppList;
                返回结果;
            }


            @覆盖
            保护无效publishResults(CharSequence的约束,FilterResults结果){
                mListAppInfo =(名单< ApplicationInfo>)results.values​​;
                notifyDataSetChanged();
            }
        };
    }
    返回过滤器;
}

}
 

这是什么问题?

增加:这是我的Drag_and_Drop_App.java:

 包com.example.awesomefilebuilderwidget;

进口的java.util.List;

进口android.app.Activity;
进口android.content.Intent;
进口android.content.pm.ApplicationInfo;
进口android.os.Bundle;
进口android.text.Editable;
进口android.text.TextWatcher;
进口android.util.Log;
进口android.view.View;
进口android.widget.AdapterView;
进口android.widget.AdapterView.OnItemClickListener;
进口android.widget.AdapterView.OnItemLongClickListener;
进口android.widget.Button;
进口android.widget.EditText;
进口android.widget.ListView;

公共类Drag_and_Drop_App延伸活动{
私人的ListView mListAppInfo;
//搜索的EditText
的EditText inputSearch;
公共静态AppInfoAdapter适配器;


@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    //主画面设置布局
    的setContentView(R.layout.drag_and_drop_app);
    //导入按钮
    按钮btnLinkToFeedback =(按钮)findViewById(R.id.btnLinkToFeedback);

    //链接反馈屏幕
    btnLinkToFeedback.setOnClickListener(新View.OnClickListener(){

        公共无效的onClick(视图查看){
            意图I =新的意图(getApplicationContext()
                    Feedback.class);
            startActivity(ⅰ);
            完();
        }
    });
    //创建新的适配器
    适配器=新AppInfoAdapter(这一点,(名单< ApplicationInfo>)Utilities.getInstalledApplication(本),getPackageManager());
    //加载列表应用
   mListAppInfo =(ListView控件)findViewById(R.id.lvApps);
    //设置适配器列表视图
    mListAppInfo.setAdapter(适配器);
    //搜索栏
    inputSearch =(EditText上)findViewById(R.id.inputSearch);

    inputSearch.addTextChangedListener(新TextWatcher(){

        @覆盖
        公共无效onTextChanged(CharSequence的CS,诠释ARG1,诠释ARG2,诠释ARG3){
            //当用户更改文本
            // Drag_and_Drop_App.this.adapter.getFilter()过滤器(CS)。
             如果(Drag_and_Drop_App.this.adapter == NULL){
                 //某些打印声明说,这是空
                 Log.d(msg_error,adapter_is_null);
             }
                。Drag_and_Drop_App.this.adapter.getFilter()过滤器(CS);

            }

        @覆盖
        公共无效beforeTextChanged(CharSequence的arg0中,诠释ARG1,INT ARG2,
                INT ARG3){
            // TODO自动生成方法存根

        }

        @覆盖
        公共无效afterTextChanged(编辑为arg0){
            // TODO自动生成方法存根
        }
        });


    当列表视图中选择了一个项目//实现事件
    mListAppInfo.setOnItemClickListener(新OnItemClickListener(){

        @覆盖
        公共无效onItemClick(适配器视图<>母公司视图中查看,INT POS,长I​​D){
            //获取列表适配器
            AppInfoAdapter appInfoAdapter =(AppInfoAdapter)parent.getAdapter();
            //获取选择列表中的项目
            ApplicationInfo APPINFO =(ApplicationInfo)appInfoAdapter.getItem(POS);
            //启动所选择的应用
            Utilities.launchApp(parent.getContext(),getPackageManager(),appInfo.packageName);
        }

    });

    //当列表视图中的项目,通过选择实现事件长期点击拖放
    mListAppInfo.setOnItemLongClickListener(新OnItemLongClickListener(){

        @覆盖
        公共布尔onItemLongClick(适配器视图<>母公司视图中查看,
                INT POS,长I​​D){
            // TODO自动生成方法存根
            //获取列表适配器
            AppInfoAdapter appInfoAdapter =(AppInfoAdapter)parent.getAdapter();
            //获取选择列表中的项目
            ApplicationInfo APPINFO =(ApplicationInfo)appInfoAdapter.getItem(POS);
            //启动所选择的应用
            Utilities.launchApp(parent.getContext(),getPackageManager(),appInfo.packageName);
            返回true;
        }


    });
}
}
 

添加的类:这是我的实用工具类:

 包com.example.awesomefilebuilderwidget;

进口的java.util.List;

进口android.content.ActivityNotFoundException;
进口android.content.Context;
进口android.content.Intent;
进口android.content.pm.PackageManager;
进口android.widget.Toast;

公共类公用事业{

/ *
 *获取移动所有已安装的应用程序,并返回一个列表
 *参数C应用程序的语境
 * @返回安装的应用程序列表
 * /
公共静态列表<> getInstalledApplication(上下文C){
    。返回c.getPackageManager()getInstalledApplications(PackageManager.GET_META_DATA);
}

/ *
 *启动应用程序
 *参数C应用程序的语境
 * @参数时的上下文的相关包管理
 *包跑了@参数PKGNAME名称
 * /
公共静态布尔launchApp(上下文C,PackageManager时许,串PKGNAME){
    //查询意图空空
    意向意图= pm.getLaunchIntentForPackage(包名称);
    //如果意图是可用
    如果(意向!= NULL){
        尝试 {
            //启动应用程序
            c.startActivity(意向);
            //如果成功
            返回true;

        //如果失败
        }赶上(ActivityNotFoundException前){
            //快速消息通知
            吐司面包= Toast.makeText(C,应用程序未找到,Toast.LENGTH_LONG);
            //显示消息
            toast.show();
        }
    }
    //默认情况下,无法启动
    返回false;
}
}
 

解决方案

您的列表中包含 appInfo.packageName 不是 appInfo.name

在performFiltering方法要添加 appInfo.name 来过滤列表。相反,你应该添加 appInfo.packageName

您的for循环应该是这样的。

 的(ApplicationInfo APPINFO:originalListAppInfo){
        字符串somefield = appInfo.packageName;
        如果(somefield.toLowerCase()。包含(constraint.toString())){
              myFilteredAppList.add(APPINFO);
        }
  }
 

这应该工作。 永远不要忘记检查空值 publishResults 方法

  @覆盖
保护无效publishResults(CharSequence的约束,FilterResults结果){

  如果(results.values​​!= NULL)
  {
    mListAppInfo =(名单< ApplicationInfo>)results.values​​;
    notifyDataSetChanged();
  }

}
 

I just finished adding a search feature to my android widget to search through a list of the users installed applications. My app installs fine and everything but when I go to search something the app force closes and I get this error:

10-18 11:10:49.393: E/AndroidRuntime(10901): FATAL EXCEPTION: main
10-18 11:10:49.393: E/AndroidRuntime(10901): java.lang.NullPointerException
10-18 11:10:49.393: E/AndroidRuntime(10901):    at com.example.awesomefilebuilderwidget.AppInfoAdapter.getCount(AppInfoAdapter.java:33)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:778)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:31)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at com.example.awesomefilebuilderwidget.AppInfoAdapter$1.publishResults(AppInfoAdapter.java:98)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at android.os.Looper.loop(Looper.java:150)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at android.app.ActivityThread.main(ActivityThread.java:4333)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at java.lang.reflect.Method.invokeNative(Native Method)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at java.lang.reflect.Method.invoke(Method.java:507)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-18 11:10:49.393: E/AndroidRuntime(10901):    at dalvik.system.NativeStart.main(Native Method)

Here is my AppInfoAdapter so I might have messed up somewhere along the line:

package com.example.awesomefilebuilderwidget;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

public class AppInfoAdapter extends BaseAdapter implements Filterable {
private Context mContext;
private List<ApplicationInfo> mListAppInfo;
private PackageManager mPackManager;
private List<ApplicationInfo> originalListAppInfo;
private Filter filter;

public AppInfoAdapter(Context c, List<ApplicationInfo> listApp, PackageManager pm) {
    mContext = c;
    this.originalListAppInfo = this.mListAppInfo = listApp;
    mPackManager = pm;
    }

@Override
public int getCount() {
    return mListAppInfo.size();
}

@Override
public Object getItem(int position) {
    return mListAppInfo.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // get the selected entry
    ApplicationInfo entry = (ApplicationInfo) mListAppInfo.get(position);

    // reference to convertView
    View v = convertView;

    // inflate new layout if null
    if(v == null) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        v = inflater.inflate(R.layout.layout_appinfo, null);
    }

    // load controls from layout resources
    ImageView ivAppIcon = (ImageView)v.findViewById(R.id.ivIcon);
    TextView tvAppName = (TextView)v.findViewById(R.id.tvName);
    TextView tvPkgName = (TextView)v.findViewById(R.id.tvPack);

    // set data to display
    ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager));
    tvAppName.setText(entry.loadLabel(mPackManager));
    tvPkgName.setText(entry.packageName);

    // return view
    return v;
}
@Override
public Filter getFilter() {
    if(filter == null) {
        filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                List<ApplicationInfo> myFilteredAppList = new ArrayList<ApplicationInfo>();
                constraint = constraint.toString().toLowerCase();

                for (ApplicationInfo appInfo : originalListAppInfo) {
                    String somefield = appInfo.name;
                    if (somefield.toLowerCase().contains(constraint.toString())) {
                        myFilteredAppList.add(appInfo);
                    }
                }
                results.count = myFilteredAppList.size();
                results.values = myFilteredAppList;
                return results;
            }


            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                mListAppInfo = (List<ApplicationInfo>)results.values;
                notifyDataSetChanged();
            }
        };
    }
    return filter;
}

}

What's the problem?

ADDED: Here is my Drag_and_Drop_App.java:

package com.example.awesomefilebuilderwidget;

import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class Drag_and_Drop_App extends Activity {
private ListView mListAppInfo;
// Search EditText
EditText inputSearch;
public static AppInfoAdapter adapter;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // set layout for the main screen
    setContentView(R.layout.drag_and_drop_app);
    // import buttons
    Button btnLinkToFeedback = (Button) findViewById(R.id.btnLinkToFeedback);

    // Link to Feedback Screen
    btnLinkToFeedback.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            Intent i = new Intent(getApplicationContext(),
                    Feedback.class);
            startActivity(i);
            finish();
        }
    });
    // create new adapter
    adapter = new AppInfoAdapter(this, (List<ApplicationInfo>) Utilities.getInstalledApplication(this), getPackageManager());
    // load list application
   mListAppInfo = (ListView)findViewById(R.id.lvApps);
    // set adapter to list view
    mListAppInfo.setAdapter(adapter);
    // search bar
    inputSearch = (EditText) findViewById(R.id.inputSearch);

    inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text
            // Drag_and_Drop_App.this.adapter.getFilter().filter(cs);  
             if (Drag_and_Drop_App.this.adapter == null){
                 // some print statement saying it is null
                 Log.d ("msg_error", "adapter_is_null");
             }
                Drag_and_Drop_App.this.adapter.getFilter().filter(cs);

            }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub                          
        }
        });


    // implement event when an item on list view is selected
    mListAppInfo.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
            // get the list adapter
            AppInfoAdapter appInfoAdapter = (AppInfoAdapter)parent.getAdapter();
            // get selected item on the list
            ApplicationInfo appInfo = (ApplicationInfo)appInfoAdapter.getItem(pos);
            // launch the selected application
            Utilities.launchApp(parent.getContext(), getPackageManager(), appInfo.packageName);
        }

    });

    // implement event when an item on list view is selected via long-click for drag and drop
    mListAppInfo.setOnItemLongClickListener(new OnItemLongClickListener(){

        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view,
                int pos, long id) {
            // TODO Auto-generated method stub
            // get the list adapter
            AppInfoAdapter appInfoAdapter = (AppInfoAdapter)parent.getAdapter();
            // get selected item on the list
            ApplicationInfo appInfo = (ApplicationInfo)appInfoAdapter.getItem(pos);
            // launch the selected application
            Utilities.launchApp(parent.getContext(), getPackageManager(), appInfo.packageName);
            return true;
        }


    });
}
}

ADDED CLASS: Here is my Utilities class:

package com.example.awesomefilebuilderwidget;

import java.util.List;

import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.widget.Toast;

public class Utilities {

/*
 * Get all installed application on mobile and return a list
 * @param   c   Context of application
 * @return  list of installed applications
 */
public static List<?> getInstalledApplication(Context c) {
    return c.getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA);
}

/*
 * Launch an application
 * @param   c   Context of application
 * @param   pm  the related package manager of the context
 * @param   pkgName Name of the package to run
 */
public static boolean launchApp(Context c, PackageManager pm, String pkgName) {
    // query the intent for lauching
    Intent intent = pm.getLaunchIntentForPackage(pkgName);
    // if intent is available
    if(intent != null) {
        try {
            // launch application
            c.startActivity(intent);
            // if succeed
            return true;

        // if fail
        } catch(ActivityNotFoundException ex) {
            // quick message notification
            Toast toast = Toast.makeText(c, "Application Not Found", Toast.LENGTH_LONG);
            // display message
            toast.show();
        }
    }
    // by default, fail to launch
    return false;
}
}

解决方案

Your list contains appInfo.packageName not appInfo.name.

In performFiltering method you are adding appInfo.name to filtered list. Instead you should add appInfo.packageName.

Your for loop should be like this

 for (ApplicationInfo appInfo : originalListAppInfo) {
        String somefield = appInfo.packageName;
        if (somefield.toLowerCase().contains(constraint.toString())) {
              myFilteredAppList.add(appInfo);
        }
  }

This should work. And never forget to check for null values in publishResults method

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

  if(results.values != null)
  {
    mListAppInfo = (List<ApplicationInfo>)results.values;
    notifyDataSetChanged();
  }

}

这篇关于空指针异常而做搜索功能的ListView控件随着BaseAdapter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆