Событие Android ListView OnItemClick срабатывает иногда, но не всегда - PullRequest
1 голос
/ 02 августа 2011

У меня очень странная проблема с компонентом Android ListView.

Ситуация: я в основном использую метод setOnItemClickListener и впоследствии переопределяю метод "onItemClick" для реализации настраиваемого действия при нажатии на элемент в представлении списка.

Проблема: событие onItemClick срабатывает, как и должно быть при нажатии на элемент, однако при нажатии на приличное количество элементов (20-30-40) внезапно один и только один из элементов становится недоступным для записи, ничего не знача происходит, когда вы нажимаете на него. Между тем, все остальные предметы все еще доступны для записи.

Я переопределил компонент ListView для захвата «dispatchTouchEvent» (см. Код ниже), и это показывает, что, когда элемент внезапно становится недоступным, dispatchTouchEvent действительно все еще запускается, с разумными координатами X и Y, но каким-то образом событие onItemClick не срабатывает.

public class ExtendedListView extends ListView 
{
public ExtendedListView(Context context) {
    super(context);     
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
    Log.v("dispatchTouchEvent", "click|X:" + ev.getX() + "|Y:" + ev.getY());
    return super.dispatchTouchEvent(ev);        
}

}

Метод, который инициирует ListView:

@SuppressWarnings("unchecked")
private void renderHomeScreenItemsList() {
    HomeScreenItemAdapter m_adapter;
    ArrayList<HomeScreenItem> lHomeScreenItems = null;

    LayoutParams lpHomeScreenItems = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);        
    lpHomeScreenItems.leftMargin = Util.dipsToPx(0, this);
    lpHomeScreenItems.topMargin = Util.dipsToPx(155, this);     
    lpHomeScreenItems.gravity = 3; //3 = LEFT. Some gravity is necessary.       
    lvHomeScreenItems = new ExtendedListView(this);
    lvHomeScreenItems.setLayoutParams(lpHomeScreenItems);

    ColorDrawable sage = new ColorDrawable(this.getResources().getColor(R.color.HomeScreenDividerColor));        
    lvHomeScreenItems.setDivider(sage);
    lvHomeScreenItems.setDividerHeight(1);

    lvHomeScreenItems.setCacheColorHint(Color.WHITE);
    lvHomeScreenItems.setBackgroundColor(Color.WHITE);      

    lHomeScreenItems = new ArrayList<HomeScreenItem>();        

    Iterator<EnabledSection> ite = Global.EnabledSectionsVector.iterator();     

    while (ite.hasNext()) {
        EnabledSection es = (EnabledSection) ite.next();

        HomeScreenItem h1 = new HomeScreenItem();
        h1.setItemText(es.FunctionTitle);
        h1.setFunctionName(es.FunctionName);

        int imageId = getResources().getIdentifier("homescreen_" + es.FunctionName.toLowerCase(), "drawable", "XXXXXXXXX");

        h1.setItemImageResourceId(imageId);

        lHomeScreenItems.add(h1);
    }

    HomeScreenItem hCopyright = new HomeScreenItem();
    hCopyright.setItemText("copyright");
    hCopyright.setItemImageResourceId(-1);
    lHomeScreenItems.add(hCopyright);       

    m_adapter = new HomeScreenItemAdapter(this, R.layout.row, lHomeScreenItems);
    lvHomeScreenItems.setAdapter(m_adapter);        

    lvHomeScreenItems.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.v("onItemClick", "Click Detected");
            HomeScreenItem hmi = (HomeScreenItem)parent.getItemAtPosition(position);

            Boolean blnAcceptClick = true;
            if (WrapperWebView == null)
                blnAcceptClick = true;
            else
                if (WrapperWebView.getProgress() != 100)
                    blnAcceptClick = false;

            if (hmi.getItemImageResourceId() != -1 && blnAcceptClick)
            {   
                Global.IsLoadingWrapper = true;
                vSelectedItem = view;

                ImageView ivIcon = (ImageView)view.findViewById(R.id.rightarrow);

                LinearLayout ll = (LinearLayout)view.findViewById(R.id.RowContainer);
                TextView ll2 = (TextView)view.findViewById(R.id.toptext);

                ll.setBackgroundResource(R.color.BlueActive);
                ll2.setBackgroundResource(R.color.BlueActive);
                ll2.setTextColor(Color.WHITE);                  

                int[] intCoordinates = new int[2];                  
                view.getLocationInWindow(intCoordinates);
                lpLoadingSpinner.topMargin = intCoordinates[1] - Util.dipsToPx(10, HomeScreen.this); 
                ivLoadingSpinner.setVisibility(View.VISIBLE);
                ivLoadingSpinner.bringToFront();

                LoadingSpinnerAnimation.start();

                ivIcon.setVisibility(View.GONE);
                ivClickedItemIcon = ivIcon;                 

                InitializeWebView(hmi.getFunctionName());        
            }               
        }
    });
}

Любая помощь будет очень полезна. Подтверждено, что ошибка возникает на нескольких устройствах и на нескольких версиях Android.

ОБНОВЛЕНИЕ: проблема устранена Мне удалось найти проблему и исправить ее. По сути, список элементов содержал все «обычные» элементы (в моем контексте), за исключением нижнего, который представлял собой элемент «авторского права» со ссылкой (синим цветом), которую нужно было нажимать. Чтобы этот эффект нажатия работал, я использовал:

tt.setMovementMethod(LinkMovementMethod.getInstance());

, если отображаемый объект был объектом авторского права.

Однако я не противодействовал этому эффекту, если отображаемый элемент был «нормальным» элементом, поэтому, только добавив строку ниже при отображении нормального элемента, проблема исчезла:

tt.setMovementMethod(null);

Полный пример кода (без удаления несоответствующего кода)

public class HomeScreenItemAdapter extends ArrayAdapter<HomeScreenItem> {

private ArrayList<HomeScreenItem> items;

public HomeScreenItemAdapter(Context context, int textViewResourceId, ArrayList<HomeScreenItem> 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) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.row, null);
    }        

    HomeScreenItem o = items.get(position);
    if (o != null) {            
        TextView tt = (TextView) v.findViewById(R.id.toptext);

        if (iv != null && tt != null)
        {
            if (position != (items.size() - 1))
            {       
            tt.setMovementMethod(null);                 
            }
            else
            {
                //last element, so setup element to show copyright notice instead
                tt.setMovementMethod(LinkMovementMethod.getInstance()); //this makes the link clickable                 
            }
        }
    }
    return v;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...