2010-10-21 4 views
2

У меня есть ListView, который я заполняю фиктивными строками прямо сейчас. В настоящее время он содержит 10 элементов, но сам вид достаточно велик, чтобы показать 5. Таким образом, список должен прокручиваться, конечно. Я построил список, используя следующий код:Android: Пользовательский ListView OnItemClickListener Странные проблемы

ListView:

<RelativeLayout 
    android:id="@+id/catList" 
    android:layout_width="wrap_content" 
    android:layout_height="216dip" 
    android:layout_marginTop="120dip" 
    > 
    <ListView 
     android:id="@+id/categoryList" 
     android:layout_width="308dip" 
     android:layout_height="216dip" 
     android:layout_marginLeft="6dip" 
     android:background="#ffffff" 
     android:divider="#ffffff" 
     android:choiceMode="singleChoice" 
     android:cacheColorHint="#00000000" 

     > 
    </ListView> 
    <ImageView 
     android:id="@+id/catListFrame" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"  
     android:layout_alignParentTop="true" 
     android:src="@drawable/selectorframe" 
     /> 
</RelativeLayout> 

Так в основном есть изображение рамки вокруг списка. Это все вложенно в другой макет.

У меня есть файл 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="10dip" 
    android:background="#ffffff" 
    > 
    <TextView 
     android:id="@+id/catTitle" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:textSize="20dip" 
     android:textColor="#000000" 
    > 
    </TextView> 
</LinearLayout> 

Вот Java, что делает всю работу:

private void setCategoryControls(){ 
    btnBackHome = (ImageView)findViewById(R.id.catHomeBtn); 
    btnBackHome.setOnClickListener(goHome); 
    catList = (ListView)findViewById(R.id.categoryList); 
    catList.setOnItemClickListener(selectCat); 
    demoCats = new ArrayList<String>(); 
    for(int i=1;i<=10;i++){ 
     demoCats.add("Item " + i); 
    } 
    m_catAdapter = new CatAdapter(this,R.layout.catitem,demoCats); 
    catList.setAdapter(m_catAdapter); 

} 

private OnItemClickListener selectCat = new OnItemClickListener(){ 
    public void onItemClick(AdapterView<?> a, View v, int position, long id){ 
     if(selCatView!=null){ 
      selCatView.setBackgroundColor(Color.parseColor("#ffffff")); 
     } 
     v.setBackgroundColor(Color.parseColor("#ffaa00")); 
     selCatView = v; 
    } 
}; 
private class CatAdapter extends ArrayAdapter<String>{ 

    private ArrayList<String> items; 

    public CatAdapter(Context context, int textViewResourceId, ArrayList<String> 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.catitem, null); 
      } 
      String cat = items.get(position); 
      if (cat != null) { 
        TextView catName = (TextView) v.findViewById(R.id.catTitle); 
        if (catName != null) { 
          catName.setText(cat); 
        } 

      } 
      return v; 
    } 
} 

Что происходит, когда я нажимаю элемент в в списке он должен просто изменить цвет фона этого элемента, вместо этого он обычно выделяет 2 элемента (один из них видимый и тот, который я должен прокрутить), и большую часть времени это даже не правильный элемент. Также, если я прокручиваю, когда элемент подсвечен, он будет случайно изменен вокруг, который подсвечивается, когда я просматриваю выделенный элемент на экране и за его пределами. Если бы я должен был догадаться, я бы сказал, что это связано с тем, что ListView apparantly отслеживает только видимых детей. Несмотря на то, что у него есть адаптер с 10 элементами, если я запустил getChildCount в представлении списка, он отображает только 5 или 6 в зависимости от того, является ли он частично видимым или нет, но он никогда не показывает больше или меньше количества видимых элементов.

ответ

0

Действительно, ListView отслеживает только отображаемых детей. Вот почему вы перерабатываете представления в свой метод getView.

Простейший способ сделать то, что вы пытаетесь достичь, - дать вашим представлениям список состояний, пригодный для использования в качестве фона. Сделайте список состояний XML доступным с состоянием state_pressed и по умолчанию (и, при желании, state_focused), и поставьте это как фоновый рисунок вашего catitem. Конечно, вам также необходимо удалить код, который делает это вручную =)

Дополнительная документация по спискам категорий состояний в here и here.

+0

Спасибо, я попробую. Моя единственная проблема заключается в том, что мне в конечном итоге нужно будет инициировать событие, которое берет информацию из щелчка. Если он все еще регистрирует неправильный элемент, он все испортит. – LoneWolfPR

+0

@ LoneWolfPR - Не волнуйтесь, у вас не будет этой проблемы. То, что происходит в вашем примере, - это не тот клик, который получает неправильный элемент: он доступен для использования при совместном использовании разных элементов. Поскольку при прокрутке вы используете один и тот же вид, он по-прежнему использует фон вида, на который вы нажали. Но вы действительно получаете правильный элемент списка каждый раз. – Jean

Смежные вопросы