У меня есть 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 в зависимости от того, является ли он частично видимым или нет, но он никогда не показывает больше или меньше количества видимых элементов.
Спасибо, я попробую. Моя единственная проблема заключается в том, что мне в конечном итоге нужно будет инициировать событие, которое берет информацию из щелчка. Если он все еще регистрирует неправильный элемент, он все испортит. – LoneWolfPR
@ LoneWolfPR - Не волнуйтесь, у вас не будет этой проблемы. То, что происходит в вашем примере, - это не тот клик, который получает неправильный элемент: он доступен для использования при совместном использовании разных элементов. Поскольку при прокрутке вы используете один и тот же вид, он по-прежнему использует фон вида, на который вы нажали. Но вы действительно получаете правильный элемент списка каждый раз. – Jean