问题描述
|
我的主要活动扩展了ListActivity并显示一个列表。我正在使用在名为DeFinitionAdapter的类中定义的自定义Listitems。
我还有一个单独的类,用于实现OnClickListener。
在类DeFinitionAdapter中,将OnClickListener设置为ListItems:
public View getView(int position,View convertView,ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row,null);
}
...
v.setonClickListener(new OnItemClickListener(position) );
return v;
}
我的自定义OnClickListener应该开始另一个活动。
public class OnItemClickListener implements OnClickListener extends Activity {
private int position;
public OnItemClickListener(int p) {
position = p;
}
@Override
public void onClick(View v) {
Intent intent = new Intent(this,ShowDeFinition.class);
startActivity(intent);
}
}
我不确定自己是否正确。我将新的活动以及清单扩展了侦听器的活动添加到了清单中:
<activity android:name=\"ShowDeFinition\" android:label=\"@string/app_name\">
</activity>
<activity android:name=\"OnItemClickListener\" android:label=\"@string/app_name\">
</activity>
但是,如果我单击列表中的项目,则应用程序始终会由于NullPointerException而中断。我想我用错了意图...任何想法?
关于尼基塔·贝洛格拉佐夫的评论:
创建Intent时会中断:
Intent intent = new Intent(this,ShowDeFinition.class);
这是堆栈跟踪:
05-23 22:56:46.629: ERROR/AndroidRuntime(258): Uncaught handler: thread main exiting due to uncaught exception
05-23 22:56:46.659: ERROR/AndroidRuntime(258): java.lang.NullPointerException
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.content.Contextwrapper.getPackageName(Contextwrapper.java:120)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.content.ComponentName.<init>(ComponentName.java:75)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.content.Intent.<init>(Intent.java:2551)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.andiandy.juradeFinitions.OnItemClickListener.onClick(OnItemClickListener.java:22)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.View.performClick(View.java:2364)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.View.onTouchEvent(View.java:4179)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.View.dispatchTouchEvent(View.java:3709)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.policy.impl.PhoneWindow$DecorView.superdispatchTouchEvent(PhoneWindow.java:1659)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.policy.impl.PhoneWindow.superdispatchTouchEvent(PhoneWindow.java:1107)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.os.Handler.dispatchMessage(Handler.java:99)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.os.Looper.loop(Looper.java:123)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at android.app.ActivityThread.main(ActivityThread.java:4363)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at java.lang.reflect.Method.invokeNative(Native Method)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at java.lang.reflect.Method.invoke(Method.java:521)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-23 22:56:46.659: ERROR/AndroidRuntime(258): at dalvik.system.NativeStart.main(Native Method)
解决方法
您的OnItemClickListener不应扩展Activity。相反,您应该安排OnItemClickListener有权访问ListActivity实例。任何已经包含在活动中的视图(例如ListView)都可以通过
getContext()
访问ListActivity实例。然后像这样实现onClick
:
@Override
public void onClick(View v) {
Intent intent = new Intent(context,ShowDefinition.class);
context.startActivity(intent);
}
,有两种方法可以实现onItemClickListener。您不需要创建新的类。也许您现在可以尝试简单的方法:)
让您的ListActivity实现AdapterView.OnItemClickListener
public class MyActivity extends ListActivity implements AdapterView.OnItemClickListener
然后在您的ListActivity \的onCreate中设置您的onClickListener,如下所示:
ListView lstvwContacts = getListView();
lstvwContacts.setOnItemClickListener(this);
然后您可以对点击做出如下反应:
public void onItemClick(AdapterView<?> parent,View v,int position,long id) {
switch (parent.getId()) {
case android.R.id.list: {
Log.v(TAG,\"onItemClick\");
Intent intent = new Intent(this,ShowDefinition.class);
startActivity(intent);
}
}
}
这应该为点击做。如果您需要知道何时选择一个项目,可以查看AdapterView.OnItemSelectedListener
-I_Artist
,您的概念是错误的,您的OnItemClickListener不应扩展Activity,也不应每次都构建一个新的onClickListener。
public class MainActivity extends Activity {
OnItemClickListener = null;
MainActivity() {
//Build your OnItemClickListener with a valid context
OnItemClickListener = new OnItemClickListener(this);
}
public View getView(int position,View convertView,ViewGroup parent) {
...
//Here user the OnItemClickListener
}
}