setOnItemClickListener не отвечает для Custom ListView

Я написал собственный адаптер для просмотра списка, но когда я попытался реализовать событие щелчка для элемента списка, я обнаружил, что он не отвечает, я буду рад, если кто-нибудь предложит мне решение.

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);

и мой пользовательский адаптер

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

и мой файл 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"

           />
</...>

person ganesh    schedule 29.04.2010    source источник


Ответы (1)


Вопрос действительно простой.

Вы не можете вызвать setOnItemClickListener до вызова setAdapter, потому что 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);
     }

}  

Таким образом, ваше мероприятие будет запущено! Извините, но у меня не было времени подробно рассказывать об исходном коде Android, если я сделаю это, я опубликую снова.

До свидания, Алекс

person Alex    schedule 08.05.2012
comment
я так не думаю. Я разработал различные приложения, в которых я установил onItemClickListerner перед настройкой адаптера. - person Siddhesh; 08.09.2012
comment
Глядя на собственный исходный код: grepcode.com/file/repository.grepcode.com/java/ext/ , вы можете определить прослушиватель кликов перед адаптером - person Niko; 07.04.2014