setOnItemClickListener没有响应Custom ListView

gan*_*esh 8 android listview adapter

我为listview编写了一个自定义适配器,但是当我尝试为列表项实现click事件时,我发现它没有响应,如果有人建议我解决方案,我会很高兴.

public class TourList extends ListActivity {
....
setContentView(R.layout.tourlist);
.....





getListView().setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
                     //i couldn't reach here
             Log.v(TAG,"did u get me");
        }
      }); 
adap = new MyAdapter(TourList.this,mylist);
getListView().setAdapter(adap);
Run Code Online (Sandbox Code Playgroud)

我的自定义适配器是

private class MyAdapter extends BaseAdapter {

            ArrayList<HashMap<String,String>> elements;
            Context ctx;

            public MyAdapter(Context context, ArrayList<HashMap<String,String>> mylist) {
                  this.elements=mylist;
                  this.ctx=context;
             }

            public boolean isEnabled(int position){
               return true;
                      }

            @Override
            public int getCount() {
                return elements.size();
                }
            @Override
            public Object getItem(int position) {
                return elements.get(position);
                }
            @Override
            public long getItemId(int position) {
                return position;
                }
                @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (convertView == null) {
                      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                      v = vi.inflate(R.layout.rowfor_tourlist, null);
                 } 

                    TextView in = (TextView)v.findViewById(R.id.intro);
                    TextView du = (TextView)v.findViewById(R.id.duration);
                    TextView pf = (TextView)v.findViewById(R.id.price);
                    TextView pn = (TextView)v.findViewById(R.id.product);
                    WebView wv=(WebView)v.findViewById(R.id.photo);  
                    in.setText(Html.fromHtml(mylist.get(position).get("Intro")));
                    du.setText(mylist.get(position).get("Duration"));
                    pf.setText(mylist.get(position).get("Price"));
                    pn.setText(mylist.get(position).get("Product"));
                    wv.getSettings().setJavaScriptEnabled(true);
                    wv.loadUrl(mylist.get(position).get("ImageURL"));

                return v;
            }           
        }//class
Run Code Online (Sandbox Code Playgroud)

我的tourlist.xml文件看起来像

 <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
            ....
        >

 <ListView android:id="@id/android:list"
           android:layout_width="fill_parent" 
           android:layout_height="fill_parent"
           android:background="@drawable/white"
            android:cacheColorHint="#00000000"
           android:layout_weight="1"

           />
</...>
Run Code Online (Sandbox Code Playgroud)

小智 1

问题很简单。

您不能在setAdapter调用之前调用setOnItemClickListener ,因为 ListView 依赖于其子级,并且在设置适配器之前其子级是未知的。

所以只需这样做:

public class StatusListView extends ListView implements OnItemClickListener {

    private StatusListAdapter adapter;

    public StatusListView(Context context) {
        super(context);
        init();
    }

    private void init() {
        // do other things
            ...

        adapter = new StatusListAdapter(getContext(), R.layout.status_list_item, statuses);
        // pay attention here
        setAdapter(adapter);
        setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        StatusListAdapter adapter = (StatusListAdapter) ((ListView) adapterView).getAdapter();
        Status status = (Status) adapter.getItem(position);
        Intent intent = new Intent(getContext(), CustomActivity.class);
        intent.putExtra(C.extra_keys.status, status);
        getContext().startActivity(intent);
     }

}  
Run Code Online (Sandbox Code Playgroud)

这样您的活动就可以启动并运行!抱歉,我没有时间详细介绍 Android 源代码,如果愿意,我会再次发布。

再见,亚历克斯