2016-05-24 5 views
0

Итак, моя проблема в том, что когда я добавляю много элементов в представление Recycler, кнопка, ниже которой нужно добавить больше элементов, исчезает, потому что он перебирается с экрана ресайклером. before add и after. Там нет кнопки:/оттолкнуто кнопкой просмотра recycler и notifyItemRemoved

здесь код XML:

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:fab="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".AddActivityFormEvent"> 


    <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:inputType="date" 
    android:ems="14" 
    android:id="@+id/dateField" 
    android:singleLine="true" 
    android:hint="@string/data" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:drawableLeft="@drawable/ic_today" 
    android:onClick="showDatePickerDialog" 

    /> 

    <Button 

    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ems="10" 
    android:inputType="time" 
    android:singleLine="true" 
    android:hint="@string/czas" 
    android:id="@+id/timeField" 
    android:layout_alignTop="@+id/dateField" 
    android:layout_toRightOf="@+id/dateField" 
    android:layout_toEndOf="@+id/dateField" 
    android:drawableLeft="@drawable/ic_time" 
    android:onClick="showTimePickerDialog"/> 

    <RelativeLayout 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:id="@+id/relativeLayout" 
    android:layout_below="@+id/dateField"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/linearLayout" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     > 


     <android.support.v7.widget.RecyclerView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/activityRecyclerView" 
      android:elevation="15dp" 
      android:layout_below="@+id/relativeLayout" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true"> 

     </android.support.v7.widget.RecyclerView> 

    </LinearLayout> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/addActivityEvent" 
     android:text="Dodaj aktywność" 

     android:layout_gravity="bottom" 
     android:layout_below="@+id/linearLayout" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 
    </RelativeLayout> 

    <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button" 
    android:id="@+id/testButton" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" /> 

    </RelativeLayout> 

Кстати, как получить фактическое положение держателя вида? Я прошу, потому что, когда я удаляю элемент в первый раз, он возвращает правильный индекс, но каждый следующий раз это еще один, например, когда я удаляю первый элемент (индекс 0), он возвращает 1 . Вот адаптер с держателем для просмотра:

public class ActivityFormEventAdapter extends RecyclerView.Adapter<ActivityFormEventAdapter.ActivityFormEventViewHolder>{ 
ArrayList<ActivityFormEvent> adapter_list = new ArrayList<>(); 
AddActivityFormEvent addActivityFormEvent; 

private static Button button; 

Context ctx; 
public ActivityFormEventAdapter(ArrayList<ActivityFormEvent> adapter_list,Context ctx){ 
    this.adapter_list=adapter_list; 
    this.ctx=ctx; 
    addActivityFormEvent= (AddActivityFormEvent) ctx; 
    button= (Button) addActivityFormEvent.findViewById(R.id.testButton); 
} 

public ActivityFormEventViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_form_event_card,parent,false); 
    ActivityFormEventViewHolder activityFormEventViewHolder = new ActivityFormEventViewHolder(view,addActivityFormEvent); 
    return activityFormEventViewHolder; 
} 

@Override 
public void onBindViewHolder(ActivityFormEventViewHolder holder, final int position) { 
    holder.activityName.setText(adapter_list.get(position).getActivityForm().getName()); 
    holder.duration.setText(adapter_list.get(position).getTime()); 
    holder.burnedKcalPerHour.setText(adapter_list.get(position).getActivityForm().getBurnedKcalPerHour()); 
    holder.burnedKcal.setText(adapter_list.get(position).getBuriedKcal()); 

    holder.deleteButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      adapter_list.remove(position); 
      notifyItemRemoved(position); 
     } 
    }); 
} 

@Override 
public int getItemCount() { 
    return adapter_list.size(); 
} 

public static class ActivityFormEventViewHolder extends RecyclerView.ViewHolder{ 
    AddActivityFormEvent addActivityFormEvent; 
    EditText activityName; 
    EditText duration; 
    EditText burnedKcalPerHour; 
    EditText burnedKcal; 
    ImageButton deleteButton; 

    public ActivityFormEventViewHolder(View itemView,AddActivityFormEvent addActivityFormEvent) { 
     super(itemView); 
     activityName = (EditText) itemView.findViewById(R.id.activityName); 
     duration = (EditText) itemView.findViewById(R.id.duration); 
     burnedKcalPerHour = (EditText) itemView.findViewById(R.id.burnedKcalPerHour); 
     burnedKcal = (EditText) itemView.findViewById(R.id.kcalExercise); 
     deleteButton = (ImageButton) itemView.findViewById(R.id.deleteButton); 
     this.addActivityFormEvent = addActivityFormEvent; 
    } 
} 
} 
+0

Что произойдет, если вы добавите 'android: layout_above =" @ + id/addActivityEvent "' к линейной компоновке и установите кнопки, которые будут выровнены снизу, а не под линейной компоновкой? –

+0

результат: [3]: http://i.stack.imgur.com/nDjrA.png Я хочу, чтобы эта кнопка прокручивалась вместе с ресайклером, я имею в виду, что она исчезает, когда recycler находится сверху (если их достаточно элементы), но показывает с достижением дна. – Azbesciak

+0

Хорошо, я справился с этой только что добавленной кнопкой на карту ... у нее нет статуса, когда он не последний ... отлично работает – Azbesciak

ответ

0

Хорошо, попробуйте это, здесь внизу вид должен иметь минимальную высоту = высоту Buttom, которая прилагается, и ее высота должна быть программно установлена ​​на высоту всего вида - высоту содержимого recyclerview. Попытайтесь изменить высоту снизу, чтобы увидеть разницу в предварительном просмотре.

<RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/relativeLayout" 
     android:layout_below="@+id/dateField"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:id="@+id/linearLayout" 
      android:layout_above="@+id/bottom_space_holder" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true"> 
      <android.support.v7.widget.RecyclerView 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:id="@+id/activityRecyclerView" 
       android:elevation="15dp" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true"> 
      </android.support.v7.widget.RecyclerView> 

     </LinearLayout> 
     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/addActivityEvent" 
      android:text="Dodaj aktywność" 
      android:layout_alignParentLeft="true" 
      android:layout_below="@+id/linearLayout" 
      android:layout_alignParentStart="true" /> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="48dp" 
      android:id="@+id/bottom_space_holder" 
      android:text="Dodaj aktywność" 
      android:layout_alignParentBottom="true"/> 
    </RelativeLayout> 
+0

testButton, как говорится в названии, просто для тестов, поэтому он будет удален. В любом случае, это не помогло, даже когда я обменивал эту фразу. – Azbesciak

+0

Я обновил нижнюю часть ответа. <Посмотрите высоту программно, и вы получите то, что хотите (должна иметь минимальную высоту высоты, которую имеет ваша кнопка) –

+0

Это нормально, но кнопка всегда в нижней части экрана, так что ... Возможно, это может быть запрограммировано за счет того, что анимация изменения размера макета будет безнадежной (как и у кнопки), но это не стоит времени:/ – Azbesciak

0

Это происходит потому, что вы поместите Button ниже RecyclerView используя layout_below и высоту RecyclerView «s установлен в wrap_content. Это означает, что после того, как контент RecyclerView превысит высоту экранов, Button упадет с экрана, потому что он расположен ниже RecyclerView.

Чтобы устранить эту проблему, необходимо выровнять Button донизу родителя (с использованием layout_alignParentBottom) и макет вашего RecyclerView над кнопкой (с использованием layout_above и layout_alignParentTop), этот способ Button всегда будет размещен и виден в нижней части ваш экран.

+0

Exacly, но я хочу, чтобы кнопка была видна только тогда, когда я вижу конец списка :) и он прокручивается вместе – Azbesciak

+0

Хорошо, тогда вы должны либо: Поместите свой RecyclerView с помощью setFixedHeight в true в ScrollView и поместите кнопку ниже Recyclerview. (простое решение, но оно не имеет лучшей производительности, поскольку элементы RecyclerView не будут переработаны, если для фиксированной высоты установлено значение true) Или вы можете добавить дополнительную строку с помощью кнопки в адаптер RecyclerView с использованием разных типов ViewTypes и использовать callbacklistener в свою активность/фрагмент, чтобы добавить новый элемент в ваш ArrayList и уведомить об этом набор данных. (что, очевидно, более сложно, чем первый вариант) – Jeffalee

+0

О первом варианте, кнопка исчезает, фиксированный размер делает ее плавающей, когда я удаляю все элементы, например, и вызываю notifyItemRemoved ... так что нет, неправильный ответ ..: / – Azbesciak

Смежные вопросы