Элементы ListView, не отвечающие на нажатие - PullRequest
1 голос
/ 29 мая 2010

Я просто промочил Android и создал пользовательский интерфейс, содержащий TabHost с тремя вкладками. Каждая вкладка работает от своей собственной активности. Первая вкладка содержит представление списка с предварительно заполненным набором строк и построена из пользовательского адаптера ArrayAdapter.

Проблема, с которой я сталкиваюсь, заключается в том, что ни одна из строк ListView не может быть изменена. Другими словами, когда я нажимаю на них, нет оранжевого выделения. Если я использую шарик прокрутки на своем Nexus One, он выберет, но любые сенсорные жесты, кажется, не отвечают.

Весь пользовательский интерфейс обрабатывается с использованием XML-файлов с файлом main.xml, содержащим TabHost -> LinearLayout -> TabWidget / FrameLayout, и файл near_activity.xml, содержащий мой пользовательский интерфейс ListView

<?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">
  <TextView  
    android:id="@+id/android:empty" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:text="@string/nearby_no_events" 
  />  

  <ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1.0"
    android:choiceMode="multipleChoice"
    android:divider="#d9d9d9"
    android:dividerHeight="1px"    
    android:cacheColorHint="#eee"  
  />  
</LinearLayout>

И соответствующий код из моей Активности, который должен отображаться на выбранной вкладке.

public class NearbyActivity extends ListActivity
{
    private ArrayList<Event> m_events = null;
    private EventAdapter m_adapter = null;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nearby_activity);

            getEvents();
        this.m_adapter = new EventAdapter(this, R.layout.eventrow, m_events);
        setListAdapter(this.m_adapter);
    }

    private void getEvents() 
    {
        m_events = new ArrayList<Event>();

        for (int i = 0; i < 100 ; i++)
        {
            Event e = new Event();
            e.setEventName("Event " + i);
            e.setVenueName("Staples Center");
            e.setStartDate(new Date());
            m_events.add(e);
        }
    }

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

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

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


      Event e = items.get(position);        
      if (e != null) 
      {
        TextView nameText = (TextView)v.findViewById(R.id.eventName);
        TextView venueNameText = (TextView)v.findViewById(R.id.venueName);
        if (nameText != null) 
        {
            nameText.setText(e.getEventName());                            
        }

        if(venueNameText != null)
        {
            venueNameText.setText(e.getVenueName());
        }
      }

      return v;
    }
    }
}

Мои строки списка просмотра также заполняются файлом XML.

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

  <TextView
    android:id="@+id/eventName"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:inputType="text"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:textSize="18sp"
    android:textColor="#000"
   />

  <TextView
    android:id="@+id/venueName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/eventName"    
    android:layout_alignParentBottom="true"
    android:layout_marginRight="55dip"    
    android:singleLine="true"
    android:ellipsize="end"
    android:scrollHorizontally="true"
    android:textSize="13sp"
    android:textColor="#313131"
    android:layout_alignWithParentIfMissing="true"
    android:gravity="center_vertical"
   />      

</RelativeLayout>

Спасибо за любую помощь, которую вы можете предложить.

1 Ответ

5 голосов
/ 29 мая 2010

Вы хотите, чтобы Listview был активным, ну, вам нужно реализовать метод onListItemClick ()

    @Override
    protected void onListItemClick(ListView l, View v, final int position, long id) {
    super.onListItemClick(l, v, position, id);                 
Toast.makeText(this,  "This is my row number " + position,Toast.LENGTH_LONG).show();
    }

и для обеспечения оранжевого цвета необходимо установить свойство

android:focusable="false"

в вашем Listview Row.xml

...