适用于自适应ListView内部ImageView的Android OnClickListener

时间:2014-05-02 23:04:18

标签: android listview onclick imageview

我有一个用于制作列表视图的列表适配器

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的任何想法?谢谢你的帮助!

2 个答案:

答案 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()); 
}