Java ListView项目在ListView适配器类中单击崩溃
我已经试着让我的列表视图工作了很长一段时间了,我刚刚将我的监听器从onClick改为onItemClick,以更好地处理列表视图项目,但应用程序再次崩溃,下面的代码,任何帮助都将不胜感激 类别: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
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();