Java ListView项目在ListView适配器类中单击崩溃

Java ListView项目在ListView适配器类中单击崩溃,java,android,android-listview,Java,Android,Android Listview,我已经试着让我的列表视图工作了很长一段时间了,我刚刚将我的监听器从onClick改为onItemClick,以更好地处理列表视图项目,但应用程序再次崩溃,下面的代码,任何帮助都将不胜感激 类别: public class ListViewAdapterProduct extends BaseAdapter { Context mContext; ListView listView = (ListView) findViewById(R.id.listview1); listView.se

我已经试着让我的列表视图工作了很长一段时间了,我刚刚将我的监听器从onClick改为onItemClick,以更好地处理列表视图项目,但应用程序再次崩溃,下面的代码,任何帮助都将不胜感激

类别:

public class ListViewAdapterProduct extends BaseAdapter {

Context mContext;
ListView listView = (ListView) findViewById(R.id.listview1);  

listView.setOnItemClickListener(new OnItemClickListener() { 

    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id){

        Resources res = mContext.getResources();
        productTitleArray = res.getStringArray(R.array.titles_product);

        for (String productTitle : productTitleArray) 
        {
            if(productTitle.equals("productOne")) 
            {
            Log.d("Msg", "Found");
            }               
        else
            {
                Log.d("Msg", "Not Found");
            }
        }
    }
});
活动:

public class MainActivityproduct extends MainActivity {


ListView list;
ListViewAdapterproduct adapter;
EditText editsearch;
String[] position;
String[] productTitles;
String[] productDescriptions;
int[] images={
        R.drawable.list_product_one, 
        R.drawable.list_product_two, 
        R.drawable.list_product_three,
    };


ArrayList<ClassproductList> arraylist = new ArrayList<ClassproductList>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    position = new String[] { "1", "2", "3"};

    Resources res = getResources();
    productTitles = res.getStringArray(R.array.titles_product);
    productDescriptions = res.getStringArray(R.array.descriptions_product);

    list = (ListView) findViewById(R.id.listview1);

    list.setAdapter(adapter);

    for (int i = 0; i < position.length; i++)
    {
        ClassproductList wp = new ClassproductList(productTitles[i], productDescriptions[i],images[i]);
        arraylist.add(wp);
    }

    adapter = new ListViewAdapterproduct(this, arraylist);

    list.setAdapter(adapter);

    editsearch = (EditText) findViewById(R.id.search);

    editsearch.addTextChangedListener(new TextWatcher() {

        @Override
       public void afterTextChanged(Editable arg0) {
            String text = editsearch.getText().toString().toLowerCase(Locale.getDefault());
            adapter.filter(text);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
                int arg2, int arg3) {
        }

        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
public类MainActivityproduct扩展了MainActivity{
列表视图列表;
ListViewAdapter产品适配器;
编辑文本编辑搜索;
字符串[]位置;
字符串[]产品名称;
字符串[]产品描述;
int[]图像={
R.drawable.list\u product\u one,
R.drawable.list\u product\u two,
R.drawable.list\u product\u three,
};
ArrayList ArrayList=新的ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
位置=新字符串[]{“1”、“2”、“3”};
Resources res=getResources();
productTitles=res.getStringArray(R.array.titles\u product);
productDescriptions=res.getStringArray(R.array.descriptions\u product);
列表=(ListView)findViewById(R.id.listview1);
list.setAdapter(适配器);
对于(int i=0;i

}您在
上下文mContext中遇到问题为空

在活动集中
mContext=this
因此mContext将是活动
上下文
您将能够使用这些资源

这是正确的代码:

由于您已经在适配器中发送了
,您需要在那里捕获它

public class ListViewAdapterProduct extends BaseAdapter {

Context mContext;
ArrayList<ClassproductList> arraylist;

ListView listView = (ListView) findViewById(R.id.listview1);  

 //add this
public ListViewAdapterProduct (Context mContext,ArrayList<ClassproductList> arraylist)
{
this.mContext = mContext;

this.arraylist = arraylist;
}
公共类ListViewAdapterProduct扩展了BaseAdapter{
语境;
ArrayList ArrayList;
ListView ListView=(ListView)findViewById(R.id.listview1);
//加上这个
公共列表ViewAdapterProduct(上下文mContext、ArrayList ArrayList)
{
this.mContext=mContext;
this.arraylist=arraylist;
}

您已经声明了mContext,但尚未初始化它

您可以在适配器的构造函数中执行此操作:

public class ListViewAdapterProduct extends BaseAdapter {

    Context mContext;

    // the construcor that initializes the context
    public ListViewAdapterProduct(Context c){
        mContext = c;
    }
    ...
但是,您发布的跟踪表明问题出在适配器的getView()方法中,第91行。您也应该检查一下

ListViewAdapterproduct.getView(ListViewAdapterproduct.java:91)
编辑:

在这一行中,适配器为null,您没有初始化它…(您设置了适配器两次,第一次设置为null)。 在本地定义变量是一种很好的做法,只有在实际需要时才将它们设置为类变量。这样就很难忘记初始化。

解决了

我从onItemClick(与自定义适配器一起使用很复杂)改回onClick(与自定义适配器一起使用很简单),并应用了:

view.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

    String mytitle=holder.title.getText().toString();

    if(mytitle.equals("ProductOne")){
        Intent intent1 = new Intent(mContext, ProductClass.ProductOne);
        mContext.startActivity(intent1);

        ...        

    }
}    
必须补充:

String mytitle=holder.title.getText().toString();

如何崩溃?您可以提供stacktrace吗?我发布了logcat,它没有告诉我任何事情,因此我没有发布它,感谢您回复
mContext
Is null defineit@Ninja-请看我上面的代码和如何操作的建议!你确定吗?我只是用示例编辑我的答案你试过了吗?我看到了,你在活动但是我在列表适配器类中工作:公共类ListViewAdapterProduct扩展BaseAdapter{您需要将活动中的上下文传递给适配器。请发布活动适配器调用代码,以便适配器将使用活动上下文,您不能在没有活动的情况下使用上下文。请尝试现在我已经编辑了我的答案,您还可以使用活动中已填充的已发送
arraylist
,以便适配器可以循环元素swhich是public View getView(final int position,View View View,ViewGroup parent){这里没什么问题,问题是我将onClick改为onitemclick查看您的logcat异常跟踪。第一行说NullPointerException在getView()的第91行方法:)我在上面发布代码的原因是为了获得详细的帮助,你认为我该怎么做我不明白你的意思。logcat跟踪是否相关?如果相关,请查看getView方法,因为这是异常发生的地方。如果不相关,那么你为什么发布它?
view.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

    String mytitle=holder.title.getText().toString();

    if(mytitle.equals("ProductOne")){
        Intent intent1 = new Intent(mContext, ProductClass.ProductOne);
        mContext.startActivity(intent1);

        ...        

    }
}    
String mytitle=holder.title.getText().toString();