我有一个用于制作列表视图的列表适配器
TaskAdapter adapter = new TaskAdapter(ToDoList.this, R.layout.item_task, tasks);
setListAdapter(adapter);
adapter.notifyDataSetChanged();
我正在尝试为它做一个onclick
,但它会不断崩溃应用程序。
ImageView iv_delete = (ImageView) findViewById(R.id.task_delete_image);
iv_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String tag_del = (String) v.getTag();
dm.deleteItem(tag_del);
finish();
startActivity(getIntent());
}
});
Log
05-02 17:46:19.405: E/AndroidRuntime(3766): FATAL EXCEPTION: main
05-02 17:46:19.405: E/AndroidRuntime(3766): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.geotasker/com.example.geotasker.ToDoList}: java.lang.NullPointerException
05-02 17:46:19.405: E/AndroidRuntime(3766): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
05-02 17:46:19.405: E/AndroidRuntime(3766): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
05-02 17:46:19.405: E/AndroidRuntime(3766): at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-02 17:46:19.405: E/AndroidRuntime(3766): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
05-02 17:46:19.405: E/AndroidRuntime(3766): at android.os.Handler.dispatchMessage(Handler.java:99)
05-02 17:46:19.405: E/AndroidRuntime(3766): at android.os.Looper.loop(Looper.java:137)
05-02 17:56:16.281: E/AndroidRuntime(3861): FATAL EXCEPTION: main
05-02 17:56:16.281: E/AndroidRuntime(3861): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.geotasker/com.example.geotasker.ToDoList}: java.lang.NullPointerException
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.os.Handler.dispatchMessage(Handler.java:99)
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.os.Looper.loop(Looper.java:137)
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.app.ActivityThread.main(ActivityThread.java:5103)
05-02 17:56:16.281: E/AndroidRuntime(3861): at java.lang.reflect.Method.invokeNative(Native Method)
05-02 17:56:16.281: E/AndroidRuntime(3861): at java.lang.reflect.Method.invoke(Method.java:525)
05-02 17:56:16.281: E/AndroidRuntime(3861): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
05-02 17:56:16.281: E/AndroidRuntime(3861): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-02 17:56:16.281: E/AndroidRuntime(3861): at dalvik.system.NativeStart.main(Native Method)
05-02 17:56:16.281: E/AndroidRuntime(3861): Caused by: java.lang.NullPointerException
05-02 17:56:16.281: E/AndroidRuntime(3861): at com.example.geotasker.ToDoList.onCreate(ToDoList.java:55)
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.app.Activity.performCreate(Activity.java:5133)
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-02 17:56:16.281: E/AndroidRuntime(3861): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
05-02 17:56:16.281: E/AndroidRuntime(3861): ... 11 more
活动:
public class ToDoList extends ListActivity {
private ActionBarActivity abarAct;
DataManager dm;
ArrayList<Task> tasks;
Task task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.task_list);
abarAct = new ActionBarActivity();
tasks = new ArrayList<Task>();
task = new Task();
dm = new DataManager(this);
new GetGeoTasks().execute();
ImageView iv_delete = (ImageView) findViewById(R.id.task_delete_image);
iv_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String tag_del = (String) v.getTag();
dm.deleteItem(tag_del);
finish();
startActivity(getIntent());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.to_do_list, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_to_do_list, container, false);
return rootView;
}
}
private class GetGeoTasks extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
tasks = dm.getAllTasks();
Log.d("demo", "doInBackground ACCESSED");
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
TaskAdapter adapter = new TaskAdapter(ToDoList.this, R.layout.item_task, tasks);
setListAdapter(adapter);
adapter.notifyDataSetChanged();
Log.d("demo", "onPostExecute ACCESSED");
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
}
有关如何访问ImageView
动态创建的布局内的ArrayAdapter
的任何想法?谢谢你的帮助!
答案 0 :(得分:1)
我认为第55行是iv_delete.setOnClickListener(...)
。如果task_delete_image
是ListView项目视图中的视图,则您无法在此处使用findViewById()
,因为尚未创建ListView项目。
您最好的选择是修改自定义适配器(TaskAdapter),并为每个项目的OnClickListener
方法设置getView()
。请参阅示例this answer。
在一个完全不相关的主题上,完成活动并创建一个新的活动只是为了刷新并不是一个好主意。
另一个完全不相关的主题;)正如问题的评论者所说,ActionBarActivity成员并没有多大意义。永远不应该直接实例化活动类,框架将通过调用startActivity()来实现。
答案 1 :(得分:0)
问题是ListActivity已经内置了onclicklistener,你只需将代码放入其中。未经测试的答案。
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
String tag_del = (String) v.getTag();
dm.deleteItem(tag_del);
finish();
startActivity(getIntent());
}