Страницы

Поиск по вопросам

Показаны сообщения с ярлыком android-view. Показать все сообщения
Показаны сообщения с ярлыком android-view. Показать все сообщения

четверг, 2 января 2020 г.

Как выполнить действие после отрисовки Activity (fragment)

#java #android #android_view


Есть ли метод с которого возможно воздействовать на только что отобразившуюся активность?
Мне надо перезапустить view, как только она отрисуется. А отрисовать надо, чтобы узнать
ее размер. После чего сразу выполнить другое действие с этими данными.
    


Ответы

Ответ 1



К примеру у вас есть View mExampleView повесьте на нее обсервер, он сработает, как только вьюшка будет нарисована на экране. Когда будет вызван onGlobalLayout, вы можете узнать ее размер, затем отпишитесь и выполняйте нужный код. ViewTreeObserver viewTreeObserver = mExampleView.getViewTreeObserver(); viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mEaxampleView.getHeight(); // будет больше 0 mEaxampleView.getViewTreeObserver().removeGlobalOnLayoutListener(this); // Остальные действия } });

Ответ 2



Мне помогает такой код: myView.postDelayed(new Runnable() { @Override public void run() { ...нужные действия } },100); на post View уже отрисовано. UPD: изменил post на postDelayed - так должно работать

Ответ 3



Скорее всего вас устроит метод onResume(). Он есть и в активити и во фрагменте.

понедельник, 2 декабря 2019 г.

Как использовать несколько view в RecyclerView

#android #android_view #recyclerview


Мне нужно в зависимости от типа объекта(записи), заполнить RecyclerView разными view,
раньше когда я делал это с помощью ListView у меня получалось, а тут я даже не знаю
как это организовать, в onCreateViewHolder сразу создается view но без учета текущей
позиции, следовательно я не могу несколько разных view там создать.

Как это можно организовать?
    


Ответы

Ответ 1



Для создания айтемов разного вида необходимо переопределить метод адаптера getItemViewType(), который будет в зависимости от условия определять, айтем какого вида требуется в данной позиции. В RecyclerView этот механизм был улучшен и метод onCreateViewHolder() возвращает значение ViewType - какой тип айтема требуется в данной позиции: class MyAdapter extends RecyclerView.Adapter { private final int TYPE_ITEM1 = 0; private final int TYPE_ITEM2 = 1; public MyAdapter () { // конструктор адаптера } @Override public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v; switch (viewType) { // инфлейтим нужную разметку в зависимости от того, // какой тип айтема нужен в данной позиции case TYPE_ITEM1: v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1, parent, false); break; case TYPE_ITEM2: v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2, parent, false); } return new ItemHolder(v); } @Override public void onBindViewHolder( ItemHolder holder, int position) { // Получаем тип айтема в данной позиции для заполнения его данными int type = getItemViewType(position); switch (type) { case TYPE_ITEM1: holder.mText1.setText("биндим данные в айтем типа 1"); break; case TYPE_ITEM2: holder.mText2.setText("биндим данные в айтем типа 2"); break; } } @Override public int getItemViewType(int position) { // условие для определения айтем какого типа выводить в конкретной позиции if (position == <условие>) return TYPE_ITEM1; return TYPE_ITEM2; } public static class ItemHolder extends RecyclerView.ViewHolder{ TextView mText1; TextView mText2; public ItemHolder(View v) { super(v); mText1 = (TextView) v.findViewById(R.id.text1); mText2 = (TextView) v.findViewById(R.id.text2); } }

Ответ 2



Можно писать свой адаптер, как ответил @pavlofff, можно воспользоваться готовыми библиотеками: https://github.com/vivchar/RendererRecyclerViewAdapter https://github.com/sockeqwe/AdapterDelegates

Ответ 3



У кого остались вопросы по примеру, приведённому выше, (или кто-то хочет более детально разобраться), в дополнение к примеру ссылку Вам!

пятница, 11 января 2019 г.

Как выполнить действие после отрисовки Activity (fragment)

Есть ли метод с которого возможно воздействовать на только что отобразившуюся активность? Мне надо перезапустить view, как только она отрисуется. А отрисовать надо, чтобы узнать ее размер. После чего сразу выполнить другое действие с этими данными.


Ответ

К примеру у вас есть View mExampleView повесьте на нее обсервер, он сработает, как только вьюшка будет нарисована на экране. Когда будет вызван onGlobalLayout, вы можете узнать ее размер, затем отпишитесь и выполняйте нужный код.
ViewTreeObserver viewTreeObserver = mExampleView.getViewTreeObserver(); viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mEaxampleView.getHeight(); // будет больше 0 mEaxampleView.getViewTreeObserver().removeGlobalOnLayoutListener(this); // Остальные действия } });

пятница, 12 октября 2018 г.

Как использовать несколько view в RecyclerView

Мне нужно в зависимости от типа объекта(записи), заполнить RecyclerView разными view, раньше когда я делал это с помощью ListView у меня получалось, а тут я даже не знаю как это организовать, в onCreateViewHolder сразу создается view но без учета текущей позиции, следовательно я не могу несколько разных view там создать.
Как это можно организовать?


Ответ

Для создания айтемов разного вида необходимо переопределить метод адаптера getItemViewType(), который будет в зависимости от условия определять, айтем какого вида требуется в данной позиции. В RecyclerView этот механизм был улучшен и метод onCreateViewHolder() возвращает значение ViewType - какой тип айтема требуется в данной позиции:
class MyAdapter extends RecyclerView.Adapter {
private final int TYPE_ITEM1 = 0; private final int TYPE_ITEM2 = 1;
public MyAdapter () { // конструктор адаптера }
@Override public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v;
switch (viewType) { // инфлейтим нужную разметку в зависимости от того, // какой тип айтема нужен в данной позиции
case TYPE_ITEM1: v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1, parent, false); break; case TYPE_ITEM2: v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2, parent, false); } return new ItemHolder(v); }
@Override public void onBindViewHolder( ItemHolder holder, int position) {
// Получаем тип айтема в данной позиции для заполнения его данными int type = getItemViewType(position);
switch (type) { case TYPE_ITEM1: holder.mText1.setText("биндим данные в айтем типа 1"); break; case TYPE_ITEM2: holder.mText2.setText("биндим данные в айтем типа 2"); break; } }
@Override public int getItemViewType(int position) { // условие для определения айтем какого типа выводить в конкретной позиции if (position == <условие>) return TYPE_ITEM1; return TYPE_ITEM2; }
public static class ItemHolder extends RecyclerView.ViewHolder{
TextView mText1; TextView mText2;
public ItemHolder(View v) { super(v);
mText1 = (TextView) v.findViewById(R.id.text1); mText2 = (TextView) v.findViewById(R.id.text2); } }