2013-05-12 32 views
0

我想在ListActivity的行的任何位置點擊以進入另一個Activity。目前,我可以在單擊ImageView時看到日誌中的行位置,但點擊未在該行的其他位置註冊。此外,Toast命令會使程序崩潰。任何援助對我的既定目標將不勝感激。謝謝!無法獲取onListItemClick爲ListActivity中的行起作用

event_row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:padding="6dip"> 

    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_marginRight="6dip" 
     android:contentDescription="@string/event_icon_desc" 
     android:src="@drawable/event_icon" /> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="0dip" 
     android:layout_weight="1" 
     android:layout_height="fill_parent"> 

     <TextView 
      android:id="@+id/event_tv" 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:textIsSelectable="true" /> 

     <TextView 
      android:id="@+id/location_tv" 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:singleLine="true" 
      android:textIsSelectable="true" /> 

     <TextView 
      android:id="@+id/date_tv" 
      android:layout_width="fill_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1" 
      android:singleLine="true" 
      android:ellipsize="marquee" 
      android:textIsSelectable="true" /> 

     </LinearLayout> 
</LinearLayout> 

display_events_activity.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/event_ll" > 

    <ListView 
     android:id="@+id/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <TextView 
     android:id="@+id/android:empty" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:text="@string/tv_empty" /> 

</LinearLayout> 

DisplayEvents.java:

public class DisplayEvents extends ListActivity { 

    private ProgressDialog progressDialog = null; 
    private ArrayList<Event> events = new ArrayList<Event>(); 
    private EventAdapter eventAdapter; 
    private Runnable viewEvents; 
    //private final int ITEMS_PER_VIEW = 10; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.disp_events_activity); 

     new EventTask().execute(); 

     this.eventAdapter = new EventAdapter(this, R.layout.event_row, this.events); 
     setListAdapter(this.eventAdapter); 

     viewEvents = new Runnable() { 
      @Override 
      public void run() { 
       getEvents(); 
      } 
     }; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 

     return true; 
    } 

    private void getEvents() { 
     runOnUiThread(adaptEvents); 
    } 

    private Runnable adaptEvents = new Runnable() { 

     @Override 
     public void run() { 
      if (events != null && events.size() > 0) { 
       eventAdapter.notifyDataSetChanged(); 

       for (int i=0; i<events.size(); i++) 
        eventAdapter.add(events.get(i)); 
      } 

      progressDialog.dismiss(); 
      eventAdapter.notifyDataSetChanged(); 
     } 
    }; 


    private class EventAdapter extends ArrayAdapter<Event> { 
     private ArrayList<Event> events; 

     public EventAdapter(Context context, int textViewResourceId, ArrayList<Event> events) { 
      super(context, textViewResourceId, events); 
      this.events = events; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      View v = convertView; 
      if (v == null) { 
       LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = li.inflate(R.layout.event_row, null); 
      } 

      Event event = events.get(position); 
      if (event != null) { 
       TextView event_tv = (TextView) v.findViewById(R.id.event_tv); 
       TextView loc_tv = (TextView) v.findViewById(R.id.location_tv); 
       TextView date_tv = (TextView) v.findViewById(R.id.date_tv); 

       if (event_tv != null) 
        event_tv.setText("Event: " + event.getEventName()); 
       if (loc_tv != null) 
        loc_tv.setText("Location: " + event.getPlace() + " - " + event.getCity()); 
       if (date_tv != null) 
        date_tv.setText("Date: " + event.getDate()); 
      } 

      v.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        Log.v("text", "Image clicked, row %d"+position); 
        Toast.makeText(DisplayEvents.this, position, Toast.LENGTH_LONG).show(); 
       } 
      }); 

      return v; 
     } 
    } 


    public class EventTask extends AsyncTask<Void, Void, ArrayList<Event>> { 

     @Override 
     protected ArrayList<Event> doInBackground(Void... Void) { 
      ArrayList<Event> dbEvents = new ArrayList<Event>(); 
      BuyTicketsConnection buyConnection = new BuyTicketsConnection(); 

      dbEvents = buyConnection.getEventsList(); 

      return dbEvents; 
     } 

     protected void onPostExecute(ArrayList<Event> dbEvents) { 
      events = dbEvents; 

      Thread thread = new Thread(null, viewEvents, "GetEventsBackground"); 
      thread.start(); 

      progressDialog = ProgressDialog.show(DisplayEvents.this, "Please wait...", "Retrieving events...", true); 
     } 
    } 
} 

編輯:

現在我已經得到了這個方法:

@覆蓋

protected void onListItemClick (ListView l, View v, int position, long id){ 
    Log.v("text", "Image clicked, row %d"+position); 
    Toast.makeText(DisplayEvents.this, position, Toast.LENGTH_LONG).show(); 
} 
我DisplayEvents(ListActivity)類

,但仍然沒有骰子。此外,我想單擊以響應該列表項中的任何內容(請注意,該行佈局中有許多視圖應該繼承單擊事件處理程序)。

看來問題是我應該如何讓event_row.xml中的所有視圖(ImageView和3 TextViews)與此OnListItemClick處理程序關聯。在OnListItemClick處理程序的上下文中,整個行(由2個LinearLayouts中的4個視圖組成)是如何識別的?

回答

1

DisplayEventsActivity上使用setOnItemClickListener並從EventAdapter中刪除setOnClickListener

+0

不幸的是,這並沒有爲我工作(編輯上面) – scagnetti 2013-05-13 18:57:50

0

問題是您的某些項目視圖是可以聚焦和/或可點擊的(因此他們吃了點擊事件並導致ListView無法接收該事件,以便知道您點擊了一個列表項目)。對於觸發單擊事件的列表,它必須能夠接收觸摸事件,而不會被孩子們吃掉。

在您的項目佈局中,您有3 TextView s都有textIsSelectable=true,這意味着TextView本身會吃掉觸摸事件。您需要禁用它才能觸發onListItemClick()事件。

0

我遇到了這個問題,並消除

機器人:textIsSelectable = 「真」

會解決這個問題。

相關問題