Пользовательские ListView нажимают проблему об объектах в Android

Таким образом, я сделал, чтобы пользовательский ListView возразил. Элементы списка имеют два textviews, сложенные друг на друге плюс горизонтальный индикатор выполнения, что я хочу остаться скрытым, пока я на самом деле не делаю что-то. Справа флажок, который я только хочу отобразить, когда пользователь должен загрузить обновления их базы (баз) данных. Когда я отключаю флажок путем установки видимости на Видимость. УВЕДЕННЫЙ, я могу нажать на элементы списка. Когда флажок видим, я не могу нажать на что-либо в списке кроме флажков. Я сделал некоторый поиск, но ничто не нашел относящимся к моей текущей ситуации. Я нашел этот вопрос, но я использую переопределенный ArrayAdapter, так как я использую ArrayLists для содержания списка баз данных внутренне. Я должен просто получить представление LinearLayout и добавить, что onClickListener как Tom сделал? Я не уверен.

Вот является listview размещение строк XML:



    
        
        
        
    
    

И вот класс, который расширяет ListActivity. Очевидно, это находится все еще в разработке, так простите вещи, которые отсутствуют или могли бы быть разбросаны, кладя:

public class UpdateActivity extends ListActivity {

    AccountManager lookupDb;
    boolean allSelected;
    UpdateListAdapter list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        lookupDb = new AccountManager(this);
        lookupDb.loadUpdates();

        setContentView(R.layout.update);
        allSelected = false;

        list = new UpdateListAdapter(this, R.layout.update_row, lookupDb.getUpdateItems());
        setListAdapter(list);

        Button btnEnterRegCode = (Button)findViewById(R.id.btnUpdateRegister);
        btnEnterRegCode.setVisibility(View.GONE);

        Button btnSelectAll = (Button)findViewById(R.id.btnSelectAll);
        btnSelectAll.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                allSelected = !allSelected;

                for(int i=0; i < lookupDb.getUpdateItems().size(); i++) {
                    lookupDb.getUpdateItem(i).setSelected(!lookupDb.getUpdateItem(i).isSelected());
                }

                list.notifyDataSetChanged();
                // loop through each UpdateItem and set the selected attribute to the inverse 

            } // end onClick
        }); // end setOnClickListener

        Button btnUpdate = (Button)findViewById(R.id.btnUpdate);
        btnUpdate.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
            } // end onClick
        }); // end setOnClickListener

        lookupDb.close();
    } // end onCreate


    @Override
    protected void onDestroy() {
        super.onDestroy();

        for (UpdateItem item : lookupDb.getUpdateItems()) {
            item.getDatabase().close();        
        }
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        UpdateItem item = lookupDb.getUpdateItem(position);

        if (item != null) {
            item.setSelected(!item.isSelected());
            list.notifyDataSetChanged();
        }
    }

    private class UpdateListAdapter extends ArrayAdapter {
        private List items;

        public UpdateListAdapter(Context context, int textViewResourceId, List items) {
            super(context, textViewResourceId, items);
            this.items = items;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = null;

            if (convertView == null) {
                LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = li.inflate(R.layout.update_row, null);
            } else {
                row = convertView;
            }

            UpdateItem item = items.get(position);

            if (item != null) {
                TextView upper = (TextView)row.findViewById(R.id.UpdateNameText);
                TextView lower = (TextView)row.findViewById(R.id.UpdateStatusText);
                CheckBox cb = (CheckBox)row.findViewById(R.id.UpdateCheckBox);

                upper.setText(item.getName());
                lower.setText(item.getStatusText());

                if (item.getStatusCode() == UpdateItem.UP_TO_DATE) {
                    cb.setVisibility(View.GONE);
                } else {
                    cb.setVisibility(View.VISIBLE);
                    cb.setChecked(item.isSelected());
                }

                ProgressBar pb = (ProgressBar)row.findViewById(R.id.UpdateProgress);
                pb.setVisibility(View.GONE);
            }
            return row;
        }

    } // end inner class UpdateListAdapter
}

править: У меня все еще есть эта проблема. Я обманываю и добавляю onClick обработчики к textviews, но кажется чрезвычайно глупым, что мой onListItemClick () функция не вызывается вообще, когда я не нажимаю на свой флажок.

110
задан Samet ÖZTOPRAK 19 November 2019 в 14:47
поделиться

2 ответа

Проблема в том, что Android не позволяет выбирать элементы списка, на которых есть элементы, на которые можно сфокусироваться. Я изменил флажок в элементе списка, чтобы он имел такой атрибут:

android:focusable="false"

Теперь элементы моего списка, содержащие флажки (работает и с кнопками), «выбираются» в традиционном смысле (они светятся, вы можете щелкнуть в любом месте в list и обработчик onListItemClick сработает и т. д.

РЕДАКТИРОВАТЬ: В качестве обновления комментатор упомянул: «Просто примечание, после изменения видимости кнопки мне пришлось снова программно отключить фокус»

243
ответ дан 24 November 2019 в 03:09
поделиться

У меня возникла аналогичная проблема, и я обнаружил, что CheckBox довольно привередлив в ListView. Что происходит, так это то, что он накладывает свою волю на весь ListItem и как бы переопределяет onListItemClick. Вы можете реализовать для этого обработчик кликов и также установить свойство text для CheckBox, вместо использования TextViews.

Я бы сказал, что посмотрите и этот объект View, он может работать лучше, чем CheckBox

Просмотр текста с проверкой

12
ответ дан 24 November 2019 в 03:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: