ListView или дочерние элементы теряют фокус - PullRequest
0 голосов
/ 12 июля 2011

У меня очень простой 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;
    }
}
...