Перебор элементов списка и изменение дочерних представлений - PullRequest
1 голос
/ 03 июля 2011
listView.setOnItemClickListener(new OnItemClickListener(){

    @Override
    public void onItemClick(AdapterView<?> parent, View viewItem, int position, long arg3) {


        for(int i =parent.getFirstVisiblePosition(); i <parent.getLastVisiblePosition(); i ++)
        {
            Log.i("in", Integer.toString(i));
            View v = parent.getChildAt(i);

            ((Button)v.findViewById(R.id.removefav)).setVisibility(View.INVISIBLE);
            ((Button)v.findViewById(R.id.gotherefav)).setVisibility(View.INVISIBLE);


        }
        viewItem=listView.getChildAt(position);
        ((Button)viewItem.findViewById(R.id.removefav)).setVisibility(View.VISIBLE);
        ((Button)viewItem.findViewById(R.id.gotherefav)).setVisibility(View.VISIBLE);
        TextView text = (TextView)viewItem.findViewById(R.id.item);
        name = text.getText();

Этот код работает, если вы нажимаете на элементы, которые видны при первом запуске ListView, но если вы прокручиваете и имеете, скажем, наполовину видимый элемент, выдает NullpointerException:

07-02 18:38:47.290: WARN/dalvikvm(6078): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
07-02 18:38:47.290: ERROR/AndroidRuntime(6078): Uncaught handler: thread main exiting due to uncaught exception
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): java.lang.NullPointerException
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at walk.me.Tabber$1.onItemClick(Tabber.java:89)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at android.widget.AdapterView.performItemClick(AdapterView.java:284)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at android.widget.ListView.performItemClick(ListView.java:3285)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at android.os.Handler.handleCallback(Handler.java:587)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at android.os.Looper.loop(Looper.java:123)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at android.app.ActivityThread.main(ActivityThread.java:4363)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at java.lang.reflect.Method.invokeNative(Native Method)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at java.lang.reflect.Method.invoke(Method.java:521)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078):     at dalvik.system.NativeStart.main(Native Method)

То, что я пытаюсь сделать, у меня есть ListView и две кнопки. И пользователь касается одного из элементов, которые отображаются дочерние виды (две кнопки), когда пользователь касается другого элемента, кнопки на ранее выбранном элементе исчезают.

Что я делаю не так? Этот «наполовину видимый» элемент (при прокрутке списка) делает NPE? Я также пытался начать с

i=0

но это было то же самое.

1 Ответ

3 голосов
/ 03 июля 2011

Вы не должны изменять подобные представления в listView.Представление списка в Android всегда поддерживается адаптером и оптимизируется таким образом, чтобы представления повторно использовались при их прокрутке за пределы экрана.Это означает, что вы всегда должны иметь getView (), реализованный в адаптере, который должен отражать, как данные (модель в адаптере) представлены в представлении.Важно правильно реагировать, когда вы получаете представление для повторного использования параметров getView (то есть не для того, чтобы создавать его с нуля, а вместо того, чтобы задавать правильные поля, тексты, видимость и т. Д. В соответствии с элементом из адаптера, соответствующим представлению).

Всякий раз, когда вы изменяете все соответствующие данные в адаптере (изменяете флаг, указывающий на видимость в вашем случае), вы должны вызывать notifyDataSetChanged () для адаптера, а затем просмотр списка воссоздает все видимые элементы самостоятельно.(он будет проходить через них и вызывать getView (), повторно используя уже созданные представления.

Посмотрите также на Android listActivity onListItemClick с CheckBox , который охватывает аналогичную проблему.

...