У меня есть GridView с 3 элементами в строке, и когда я нажимаю на элемент, под строкой появляется новое представление. Это немного похоже на приложение для папки на iOS. Я не нашел ответа на SO или в Google. Может быть, вы можете дать мне несколько намеков.Добавить представление между двумя строками Gridview
ответ
Вы можете сделать это легко с GridLayout
, но не с GridView
.
Чтобы узнать доступную ширину сетки перед тем, как разместить предметы и установить количество столбцов, установите либо ViewTreeObserver.OnGlobalLayoutListener
(который может затем разместить ваши предметы), либо расширьте GridLayout и переопределите onMeasure (int widthMeasureSpec, int heightMeasureSpec)
.
Вставьте строку после каждой строки содержимого и установите ее видимость на Visibility.GONE
и ее номер columnSpec
на количество столбцов вашего GridLayout
. Когда пользователь ударяет элемент, вы можете получить его информацию, заполнить представление под ним и развернуть или изменить его видимость.
Наконец, для индикатора я бы просто добавил его как дочерний элемент скрытой строки, и когда пользователь закроет элемент, вычислите горизонтальный центр указанного элемента и точно разместите центр этого представления по оси X до этого координаты (поля для этого были бы в порядке).
Обратите внимание, что для очень больших списков элементов это не рекомендуется, так как вам нужно будет создавать экземпляр каждого элемента для немедленного отображения, независимо от того, все ли они подходят на экране или нет. В отличие от GridView
, GridLayout
не является ребенком AbsListView
.
Хотя очевидно, что нет родной компонент выполнить то, что вы хотите сделать здесь, есть несколько способов, чтобы получить эффект, который вы хотите, комбинируя и другие методы.
Один из способов, о котором я могу думать, - создать свой собственный адаптер и добавить функциональность, чтобы вставить еще 3 элемента под строку, щелкнутую с каким-то переименованием, чтобы вы могли отличить ее от обычного вида, конечно же, в getView метод адаптера, вам нужно будет сделать валидацию, чтобы узнать, какое представление надуть и вернуть, после обновления представления эти 3 элемента будут вставлены под щелчком элемента, и, конечно, вы можете избавиться от них, изменив список адаптером отображается. (Этот подход требует довольно хороших знаний о пользовательских адаптерах, я сделал что-то вроде этого и является чистым и хорошим подходом).
Другой подход к этой проблеме, который не так хорош, как первый, однако, абсолютно выполнит трюк, создав «Шаблон» Эффекта, который вы хотите получить (например, тот, который вы видите на картинке), сохраните этот шаблон как часть активности поверх вашего вида сетки невидимым, как только кто-то нажат на элемент, заполните шаблон соответствующим информации, которую вы хотите показать, сделайте сетку невидимой и принесите «шаблон», видимый на верхней части сетки, с информацией, которую вы хотите показать правильно заполненной, пользователь не заметит изменения, и когда вы захотите вернуться к представлению сетки, просто удалите этот «шаблонный» вид, и он будет действовать имея сетку так, как она была первоначально.
Надеюсь, это поможет.
С уважением!
Я использую TableLayout.addView для добавления ImageView, ему может понадобиться другая переменная removeView, в настоящее время я просто удаляю ее и добавляю еще одну кнопку при нажатии кнопки.
изменить ImageView по своей позиции, которую вы можете основывать на том, чтобы изменить цвет фона, так что пользователь будет предположить, что это связано с одним клике
ImageView imag;
boolean imageOn = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imag = new ImageView(this);
final TableLayout table = (TableLayout) findViewById(R.id.tableLayoutCategoryButtons);
int buttonsInRow = 3;
String[] itemNames = getResources().getStringArray(R.array.categories_array);
int numRows=(itemNames.length/buttonsInRow);
if (itemNames.length%buttonsInRow!=0)
numRows++;
Button[] buttons = new Button[itemNames.length];
LinearLayout[] tablerowLayout = new LinearLayout[numRows];
tablerowLayout[0] = new LinearLayout(table.getContext());
int rowcount=0;
for (int i=0; i<itemNames.length; i++){
buttons[i]= new Button(table.getContext(), null, android.R.attr.buttonStyleSmall);
buttons[i].setText(itemNames[i]);
buttons[i].setId(i);
buttons[i].setTextColor(Color.BLACK);
buttons[i].setVisibility(View.VISIBLE);
buttons[i].setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(imageOn){
table.removeView(imag);
imageOn = false;
}
int index = v.getId()/buttonsInRow+1;
if(v.getId()%buttonsInRow==1)
imag.setImageResource(R.drawable.reta);
else if(v.getId()%buttonsInRow==2)
imag.setImageResource(R.drawable.reta2);
else
imag.setImageResource(R.drawable.reta3);
imageOn = true;
table.addView(imag, index);
}});
LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
tablerowLayout[rowcount].addView(buttons[i], buttonLayoutParams);
if (((i+1)%buttonsInRow==0)&&(i!=0)){
table.addView(tablerowLayout[rowcount++]);
if(rowcount<numRows)
tablerowLayout[rowcount] = new LinearLayout(table.getContext());
}
}
if(rowcount<numRows)
table.addView(tablerowLayout[rowcount]);
Невозможно сделать то же самое с GridView? –
Нет, я не знаю, как это сделать. – Gina
@QuentinDOMMERC: Вы могли добиться того же, используя gridView? Пожалуйста, помогите, если вы это поняли. – user1517153
- 1. Добавить строку между двумя строками
- 2. Как добавить '/' между двумя строками?
- 3. Как добавить поля между строками gridview
- 4. echo добавить новую строку между двумя строками
- 5. Как добавить UILabel между двумя строками
- 6. равенство между двумя строками
- 7. Расстояние между двумя строками
- 8. разница между двумя строками
- 9. Добавление пространства между двумя строками
- 10. Добавление разделителя между строками GridView
- 11. Заменить текст между двумя строками
- 12. Захват текста между двумя строками
- 13. Python - разница между двумя строками
- 14. Разница между этими двумя строками?
- 15. SQL-запрос между двумя строками
- 16. Извлечь содержимое между двумя строками
- 17. вычислить разницу между двумя строками
- 18. функция использования между двумя строками
- 19. Удаление котировок между двумя строками
- 20. str_replace между двумя числовыми строками
- 21. Количество матчей между двумя строками
- 22. Извлечение строки между двумя строками
- 23. Расстояние между двумя двоичными строками
- 24. Получить информацию между двумя строками
- 25. Perl между двумя строками regex
- 26. Соответствующие символы между двумя строками
- 27. Ascii разница между двумя строками
- 28. Отображение пересечения между двумя строками
- 29. Удалить пробел между двумя строками
- 30. матча все между двумя строками
Изображение, которое вы отправили, именно то, что вы хотите? – Luksprog
Более или менее. Когда я нажимаю на большой палец, я хочу, чтобы представление открывалось и отображало детали на самом деле :) –
Да, но вы хотите иметь тот же вид, что и на изображении, в основном из новой строки (с индикатором фактического щелчка элемента) ? – Luksprog