2

Я использовал это руководство для создания пользовательского ListView, который анализирует свои данные из JSON.Добавить плавучую кнопку действия в списокFragment с помощью настраиваемого ArrayAdapter

https://www.bignerdranch.com/blog/customizing-android-listview-rows-subclassing/

Я хочу добавить Плавающую кнопку Действия на ItemListFragment, но не знаю, как.

Пробовал ставить его под здесь:

public ItemView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    LayoutInflater.from(context).inflate(R.layout.item_view_children, this, true); 
    setupChildren(); 
} 

Но он получает отображается на каждый элемент, который я не хочу.

Вот код с полным, например:

https://github.com/bignerdranch/android-listview-custom-view/tree/master/ListItemViewDemo/src/com/bignerdranch/android/listitemviewdemo

Любые идеи, как это сделать?

Пытался изменить надуть, но работа dosen't:

public static ItemView inflate(ViewGroup parent) { 
    ItemView itemView = (ItemView)LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item_view, parent, false); 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    FloatingActionButton fab = (FloatingActionButton) inflater.inflate(R.layout.fab_view, parent, false); 
    return itemView; 
} 

EDIT:

Если я поместить его под конструктором, он работает нормально. Но Поскольку конструктор вызывается несколько раз для каждого представления, я должен найти способ вызвать его только один раз.

public ItemView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    LayoutInflater.from(context).inflate(R.layout.item_view_children, this, true); 
    LayoutInflater.from(context).inflate(R.layout.fab_view, this, true); 
    setupChildren(); 
} 
+0

добавить программно FAB в свой список активности Java-класс – piotrek1543

+0

https://github.com/shamanland/floating-action-button с хорошими документы, которые должны быть в состоянии следовать за ФАБ ... –

+0

Спасибо за вашу информацию ,Я уже проверил, как работает Floating Action Button. Я не могу понять, как разместить его в моем ListiView, который использует специальный адаптер. – Spira

ответ

1

Solution наконец был найден. Было гораздо проще, чем я думал. ItemListFragment, который расширяет метод ListFragment onCreateView, вызывает переопределенный метод.

Так замена:

View v = super.onCreateView(inflater, container, savedInstanceState); 

с:

View v = inflater.inflate(R.layout.list_view, null); 

работал!

также установить list_vew.xml:

<FrameLayout> 
    <ListView android:id="@id/android:list" /> 
    <Button /> 
</FrameLayout> 
+0

Вы перерабатываете завышенные виды? Или просто создать их и оставить там? –

+0

Как новый для Android, не так много знать, чтобы ответить вам. Я думаю, что это может лучше ответить: http://stackoverflow.com/questions/15912999/recycling-views-in-custom-array-adapter-how-exactly-is-it-handled – Spira

0

Добавить этот код в ваш формат макета XML, и он будет отображаться в нижнем правом углу.

<android.support.design.widget.FloatingActionButton android:id="@+id/fab" 
android:layout_width="wrap_content" android:layout_height="wrap_content" 
android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" 
android:src="@android:drawable/ic_menu_camera" /> 

Тогда в классе фрагмента можно назвать с этим кодом

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //put your code here 
     } 
    }); 
+0

Это не сработает. Если вы посмотрите на ItemView, он расширяет RelativeLayout и раздувает R.layout.item_view. После этого он раздувает каждое представление как LayoutInflater.from (context) .inflate (R.layout.item_view_children, this, true); – Spira

+0

Потому что это в классе ItemView @Spira. Он должен помещать его в свой класс ItemListFragment. –

+0

Можете ли вы привести пример этого? Класс ItemListFragment dosen't имеет файл макета xml. – Spira

0

Xamarin Android:

RX полезно здесь. Вы можете подписаться на событие TabSelected для TabLayout в своей деятельности. В приведенном ниже примере у меня есть три вкладки. Для первой вкладки я не хочу показывать кнопку плавающего действия. Однако для двух других я показываю кнопку с плавающим действием.

var tabs = FindViewById<TabLayout>(Resource.Id.tabLayout); 
tabs.SetupWithViewPager(viewPager); 

Observable.FromEventPattern<EventHandler<TabLayout.TabSelectedEventArgs>, TabLayout.TabSelectedEventArgs>(
      x => tabs.TabSelected += x, x => tabs.TabSelected -= x) 
     .Subscribe(s => 
     { 
      var tabLayout = s.Sender as TabLayout; 
      if (tabLayout.SelectedTabPosition == 0) 
       FloatingActionButton.Hide(); 
      else 
       FloatingActionButton.Show(); 

      viewPager.SetCurrentItem(tabLayout.SelectedTabPosition, true); 
     }); 
Смежные вопросы