У меня очень простой ListView.Каждая строка может быть нажата и при нажатии загружает немного собственного всплывающего окна.Это работает просто отлично .. большую часть времени.
Проблема в том, что после быстрой прокрутки ListView вверх и вниз несколько раз ListView теряет фокус и больше не позволяет нажимать на строки.Покидая активность и возвращаясь, сбрасывает ListView и все снова работает ... пока вы не прокрутите быстро несколько раз.
ListView довольно прост:
<ListView android:id="@+id/favorites_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:listSelector="@drawable/list_selector_background"
/>
Я также пытался установить android:focusableInTouchMode="true"
и android:focusable="true"
в ListView - но это ничего не меняет.Если я вызываю list.requestFocusFromTouch();
после того, как мой список получает свои данные, все работает - но ListView начинается с первой выбранной строки, и он обычно портит пользовательский интерфейс, выбирая вещи случайным образом.
Я слушаю щелчки элементовреализация public void onItemClick(AdapterView<?> parent, View view, int position, long id)
и установка подкласса OnItemClickListener
в ListView через setOnItemClickListener()
.Внутри onItemClick я выскакиваю небольшое PopupWindow - но здесь проблема, похоже, не возникает - проблема возникает, когда я прокручиваю общий ListView вверх и вниз несколько раз.
Как я могу убедиться, что элементыв списке всегда есть возможность реагировать на прикосновения?
Вот адаптер, который используется:
private class FavoritesAdapter extends BaseAdapter {
private LayoutInflater mLayoutInflater;
public FavoritesAdapter(){
mLayoutInflater = (LayoutInflater) FavoritesActivity.this.getSystemService(LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return manager.getItemCount();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
if(position == getCount() - 1)
manager.retrieveNextPageOfFavorites();
ViewHolder holder;
if(convertView == null){
convertView = mLayoutInflater.inflate(R.layout.favorites_list_item, null);
holder = new ViewHolder();
holder.brandName = (TextView)convertView.findViewById(R.id.favorites_list_item_brand);
holder.productName = (TextView)convertView.findViewById(R.id.favorites_list_item_product);
holder.size = (TextView)convertView.findViewById(R.id.favorites_list_item_size);
holder.width = (TextView)convertView.findViewById(R.id.favorites_list_item_width);
holder.image = (ImageView)convertView.findViewById(R.id.favorites_list_item_image);
((TextView)convertView.findViewById(R.id.favorites_list_item_size_tag)).setTypeface(...);
((TextView)convertView.findViewById(R.id.favorites_list_item_width_tag)).setTypeface(...);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
FavoritesItemInfo fav = manager.getFavoritesItem(position);
holder.brandName.setText(fav.brandName);
holder.productName.setText(fav.productName);
holder.size.setText(fav.size);
holder.width.setText(fav.width);
BitmapDrawable drawable = manager.getProductImage(position);
holder.image.setImageDrawable(drawable);
return convertView;
}
private class ViewHolder {
public TextView brandName;
public TextView productName;
public TextView size;
public TextView width;
public ImageView image;
}
}