#android #android-layout #android-listview
#Android #android-layout #android-listview
Вопрос:
Для начала я использовал обучающий код Android notepad. В моем notes_row.xml у меня есть textview для отображения заголовка заметки и флажка, который изначально скрыт Android: видимость = «исчезла»
Я хочу, чтобы, когда пользователь открывает меню опций и нажимает «Отметить», флажки перед каждым элементом в списке должны стать видимыми. Однако, когда я нажимаю на пометку в эмуляторе, становится видимым флажок только для первой заметки. Итак, я хочу выполнить итерацию по всему списку и установить видимость (0), чтобы все флажки были видны. Я новичок, поэтому, пожалуйста, ответьте подробно. Заранее спасибо.
Мой фрагмент кода:
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch(item.getItemId()) {
case INSERT_ID:
createNote();
return true;
case MARK_ID:
// only first item check box appears with following 2 lines:
CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
checkBox.setVisibility(0);
/* tried the following, but no chekbox appears with this:
Cursor c = mDbHelper.fetchAllNotes();
c.moveToPosition(0);
while(c.isAfterLast()){
CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
checkBox.setVisibility(0);
c.moveToNext();
}
*/
return true;
}
В моем новом коде после прочтения ответов по-прежнему отображается только флажок первого элемента:
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch(item.getItemId()) {
case INSERT_ID:
createNote();
return true;
case MARK_ID:
CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox1);
String[] lvItems = new String[]{NotesDbAdapter.KEY_TITLE};
MyAdapter arrAdapter = new MyAdapter(this, android.R.layout.simple_list_item_multiple_choice, lvItems);
arrAdapter.toggleCheckBoxVisibility(checkBox);
arrAdapter.notifyDataSetChanged();
return true;
return super.onMenuItemSelected(featureId, item);
}
Вот мой адаптер:
private class MyAdapter extends ArrayAdapter<String>{
public MyAdapter(Context context, int textViewResourceId,
String[] objects) {
super(context, textViewResourceId, objects);
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.notes_row, parent, false);
//String[] from = new String[]{NotesDbAdapter.KEY_TITLE};
return row;
//return super.getView(position, convertView, parent);
}
public boolean toggleCheckBoxVisibility(CheckBox checkBox){
checkBox.setVisibility(0);
super.notifyDataSetChanged();
return true;
}
}
Комментарии:
1. на какой адаптер вы подаете в суд за отображение отдельного элемента в списке
2. я использую: Cursor notesCursor = mDbHelper.fetchAllNotes(); startManagingCursor(notesCursor); // Создаем массив для указания полей, которые мы хотим отобразить в списке (только ЗАГОЛОВОК) String[] from = new String[]{notesdabadapter. KEY_TITLE}; // и массив полей, к которым мы хотим привязать эти поля (в данном случае просто text1) int[] to = new int[]{R.id.textView1}; // Теперь создайте простой адаптер курсора и настройте его на отображение SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, notesCursor, from, to); setListAdapter( примечания); }
Ответ №1:
В вашем адаптере создайте метод для установки логического флага для видимости. При нажатии кнопки вызовите метод и установите флаг в true. Затем используйте notifyDataSetChanged()
для обновления вашего списка. Затем в вашем методе getView вы можете установить видимость вашего флажка на значение, указанное в логическом флаге.
Комментарии:
1. Я сделал это, но по-прежнему отображается только флажок первого элемента. Пожалуйста, ознакомьтесь с изменениями в вопросе. Я могу отправить вам полный проект по электронной почте, если хотите. Спасибо.
2. Вы неправильно поняли мой подход — метод в адаптере должен быть: public void toggleCheckBoxVisibility(логическая видимость){ checkboxVisibility = видимость; notifyDataSetChanged(); } Затем в вашем getView вы используете: CheckBox флажок = (CheckBox) row.findViewById(R.id.checkBox1); checkBox.setVisibility(checkboxVisibility? Вид. ВИДИМЫЙ: View.GONE);
Ответ №2:
- Возьмите свой адаптер списка
- Выполните итерацию по представлениям элементов списка с помощью getView (или аналогичного)
- Для каждого извлекаемого представления выполните v.setVisibility (Просмотр.ВИДИМЫЙ)
Это примерно то, что вам нужно сделать, чтобы взаимодействовать с каждым представлением вашего списка
РЕДАКТИРОВАТЬ: более конкретно: внутри основного потока вашей активности
MyAdapter a= (MyAdapter) this.getArrayAdapter();
//count how many views you have to iterate and build a for loop accordingly
for(...){
View v = a.getView(/*based on the for index position */).setVisibility(View.VISIBLE)
//Do something else with the view if you want...
Это решение предполагает, что вы уже создали и связали с вашей деятельностью адаптер массива.
Комментарии:
1. Пожалуйста, уточните шаг 2!! вот в чем мой вопрос! Спасибо.
2. например, внутри основного потока вашей активности: MyAdapter a= (MyAdapter) this.getArrayAdapter(); //подсчитайте, сколько просмотров вам нужно выполнить итерацию, и создайте цикл for соответственно View v = a.getView(/*на основе позиции индекса for */).setVisibility(Просмотр. ВИДИМЫЙ) // Сделайте что-нибудь еще с представлением, если хотите…
Ответ №3:
Попробуйте это: В вашем классе напишите этот код:
@Override
protected void onStart() {
super.onStart();
ArrayAdapter<String> araAdapter=new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_list_item_multiple_choice, xmlList);
listView_xml.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
listView_xml.setAdapter(araAdapter);
}
XMLList — это то, что вы сохраняете в данных, или ваш массив string[]. listview_xml — это имя вашего listview.
Ознакомьтесь с этим руководством по реализации нескольких флажков