2015-08-28 3 views
0

У меня есть RecyclerView, который загружает свои данные из базы данных SQLite. Каждая строка имеет 3 EditText с и 1 Checkbox:Скрыть виды от RecyclerView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/row_content" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="horizontal" 
      android:padding="6dp" 
      android:background="?android:attr/selectableItemBackground"> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/element_name_editText" 
     android:singleLine="true"/> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/element_quantity_editText" 
     android:singleLine="true"/> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="numberDecimal" 
     android:ems="10" 
     android:id="@+id/element_price_editText" 
     android:singleLine="true"/> 

    <CheckBox 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/element_checkBox"/> 

Это результат:

View_1

То, что я пытаюсь добиться, чтобы скрыть два вида (element_quantity_editText и element_price_editText) при нажатии кнопки в фрагменте, содержащем RecyclerView. Результатом будет что-то вроде этого

View_2

На данный момент я попытался использовать несколько ViewTypes как в How to create RecyclerView with multiple view type?

Однако, это относится только к новым добавляемых элементов, а не к остальным.

Это то, что я сейчас:

Myadapter

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); 
    mShow=mPrefs.getBoolean("0", true); 

     if (viewType==VIEW_TYPE_ELEMENT){ 

      if(mShow) { 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.elements_item, parent, false); 
      ElementsRowHolder vh = new ElementsRowHolder(v,mShow); 
      return vh; 
      } 
      else{ 
       View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.elements_item_0, parent, false);//elements_item_0 only contains TITLE and CHECKBOX 
       ElementsRowHolder vh = new ElementsRowHolder(v,mShow); 
       return vh; 
      } 
     } 
     else { 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.new_element_item, parent, false); 
      NewElementRowHolder vh = new NewElementRowHolder(v); 
      return vh; 
     } 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (holder instanceof ElementsRowHolder) { 
     ((ElementsRowHolder)holder).bindModel(mData.get(position)); 
     } 
} 

@Override 
public int getItemCount() { 
     return(mData.size()+1); 
} 

@Override 
public int getItemViewType(int position) { 
    return (position == mData.size()) ? VIEW_TYPE_BUTTON : VIEW_TYPE_ELEMENT; 
} 

Мой ViewHolder

public ElementsRowHolder(View row, boolean mShow) { 
    super(row); 

    this.mShow = mShow; 

    mElementName=(EditText)row.findViewById(R.id.element_name_editText); 
    mElementQuantity=(EditText)row.findViewById(R.id.element_quantity_editText); 
    mElementPrice=(EditText)row.findViewById(R.id.element_price_editText); 
    mElementCheckBox=(CheckBox)row.findViewById(R.id.element_checkBox); 

    if(mShow) { 
     mElementQuantity.setVisibility(View.VISIBLE); 
     mElementPrice.setVisibility(View.VISIBLE); 
     mElementName.setVisibility(View.VISIBLE); 
     mElementCheckBox.setVisibility(View.VISIBLE); 
    } 
    else { 
     mElementQuantity.setVisibility(View.GONE); 
     mElementPrice.setVisibility(View.GONE); 
     mElementName.setVisibility(View.VISIBLE); 
     mElementCheckBox.setVisibility(View.VISIBLE); 
    } 

    row.setOnClickListener(this); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     row.setOnTouchListener(new View.OnTouchListener() { 
      @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       v.findViewById(R.id.row_content).getBackground().setHotspot(event.getX(), event.getY()); 
       return(false); 
      } 
     }); 
    } 
} 

void bindModel(Element e) { 

    mElementName.setText(e.getName()); 
    if (e.getQuantity() == null && e.getCost() == null) { 
    } else { 
     mElementQuantity.setText(e.getQuantity().toString()); 
     mElementPrice.setText(e.getCost().toString()); 
    } 
    mElementCheckBox.setActivated(false); 

} 
+0

разместить свой код, то мы можем отслеживать вас ... – TheGreat004

+0

Добавлено больше кода, надеюсь, что это достаточно! – hwiz

ответ

0

В классе адаптера, сделать переменную

int var_visibility = View.VISIBLE; 

В ваш ViewHolder, выполните следующие действия.

element_quantity_editText.setVisibility(var_visibility); 
element_price_editText.setVisibility(var_visibility); 

Теперь в вашем CheckBox слушателю сделать это

if(checkbox.isChecked) 
    var_visibility = View.VISIBLE; 
else 
    var_visibility = View.GONE; 

notifyDataSetChanged(); 
0

В адаптере, добавьте атрибут boolean (т.е. private boolean mShowsView), установите истинным или ложным в зависимости от видимости ваших взглядов.

В способе вашего адаптера onBindViewHolder отобразите представления, только если для параметра mShowsView установлено значение «true». Вы можете играть с

setVisibility(View.VISIBLE/View.GONE); 

В вашем fragment, при нажатии на кнопку, выполните следующие действия:

`mAdapter.setShowsView(true/false);` 
// to show or hide your views 
mAdapter.notifyDataSetChanged(); 
// to refresh your adapter 
+0

Это работает, но только для новых добавленных элементов в представлении Recycler, я пытаюсь применить его ко всем элементам (новым и старым). – hwiz

+0

Этот метод также будет работать для более старых элементов: просто играйте с видимостью для все элементы. В вашем случае this.mShow = mShow следует вызывать в конструкторе адаптера, а не во всех привязках вида. – Suiko

+0

Не могли бы вы предоставить какой-то код или пример? – hwiz

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