2017-01-13 5 views
-4

Привет, У меня есть вопрос относительно CardViews в RecyclerView. Мои карты имеют в основном 2 сегмента, то есть базовую карту и расширенную карту. Мой OnClick просто устанавливает свойство setVisibility каждого сегмента либо GONE, либо VISIBLE. Прямо сейчас мой OnClickListener находится в OnBindViewHolder методе. Я прочитал, что лучше поместить его в класс ViewHolder, однако я не уверен, как достичь такого же результата в данный момент. Моя главная проблема лучше всего представлены изображения ниже:Как установитьVisibilty карты CardView одной карты, не затрагивая другие карты

Это способ по умолчанию изображения должны быть отображены или «base_view»

Base CardView

При нажатии на изображение, карта будет показывать информацию связанные с этой картой, ака «расширенный просмотр».

Expanded CardView on Click

Как я могу предотвратить другого CardViews (средней и правая карта) от изменения (от квадрата к длинному прямоугольнику) при изменении расположения одной карты? Пример следующим образом:

enter image description here

Это мой CardView XML:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
xmlns:app="http://schemas.android.com/tools" 
android:layout_gravity="center" 
app:cardCornerRadius="8dp" 
android:layout_margin="1dp" 
android:id="@+id/cv_army"> 


<RelativeLayout 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 

<RelativeLayout 
    android:layout_width="90dp" 
    android:layout_height="90dp" 
    android:orientation="vertical" 
    android:id="@+id/base_card"> 

    <ImageView 
     android:layout_width="90dp" 
     android:layout_height="120dp" 
     android:layout_margin="2dp" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:src="@drawable/summon_cm" 
     android:scaleType="fitCenter" 
     android:id="@+id/iv_card"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@id/iv_card" 
     android:layout_marginBottom="10dp" 
     android:layout_centerHorizontal="true" 
     android:textColor="#000" 
     android:text="Test" 
     android:textAllCaps="false" 
     android:textSize="10dp" 
     android:textAlignment="center" 
     android:background="#ffffff" 
     android:backgroundTint="@color/trans_success_stroke_color" 
     android:id="@+id/tv_card"/> 

</RelativeLayout> 

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="100dp" 
    android:layout_height="150dp" 
    android:layout_gravity="center" 
    android:background="@color/colorPrimaryDark" 
    android:id="@+id/expanded_card"> 

    <TextView 
     android:layout_width="90dp" 
     android:layout_height="wrap_content" 
     android:id="@+id/card_popup_name" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="5dp" 
     android:layout_centerHorizontal="true" 
     android:text="Card Name"/> 


    <ImageView 
     android:layout_width="90dp" 
     android:layout_height="80dp" 
     android:src="@drawable/bg_summon" 
     android:scaleType="fitCenter" 
     android:id="@+id/card_popup_img" 
     android:layout_below="@id/card_popup_name" 
     android:layout_marginTop="5dp" 
     android:layout_centerHorizontal="true"/> 

    <TextView 
     android:layout_width="35dp" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/card_popup_img" 
     android:layout_marginTop="10dp" 
     android:layout_alignStart="@id/card_popup_img" 
     android:id="@+id/card_popup_hp" 
     android:text="HP" 
     android:textAlignment="viewEnd" 
     android:layout_gravity="end"/> 

    <TextView 
     android:text="123" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@id/card_popup_hp" 
     android:layout_alignStart="@id/card_popup_img" 
     android:layout_marginStart="45dp" 
     android:id="@+id/tv_hp" /> 

    <Button 
     android:text="Use" 
     android:textSize="10dp" 
     android:layout_width="wrap_content" 
     android:layout_height="30dp" 
     android:layout_alignParentBottom="true" 
     android:layout_marginBottom="5dp" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/btn_use" /> 
</RelativeLayout> 

</RelativeLayout></android.support.v7.widget.CardView> 

Я положил onBindView здесь, а только в случае, если это необходимо:

@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 

    holder.base_card.setVisibility(View.VISIBLE); 
    holder.expanded_card.setVisibility(View.GONE); 
    final int p = position; 
    String s = card_list.get(p).card_name; 
    final String sx = s.substring(1); //The 1st position [index 0] stores the rarity of the card, so remove that from the string to get the name 
    holder.tv_card.setText(sx); 
    holder.iv_card.setImageResource(card_list.get(p).card_img); 

    //RV_Animator.animate(holder); 

    holder.iv_card.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     holder.expanded_card.setVisibility(View.VISIBLE); 
     holder.base_card.setVisibility(View.GONE); 

      for (int ix =0; ix<getItemCount();ix++){ 
       if (ix!=p){ 
        notifyItemChanged(ix); 
       } 
      } 

     } 
    }); 

    holder.expanded_card.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View vy) { 
      holder.expanded_card.setVisibility(View.GONE); 
      holder.base_card.setVisibility(View.VISIBLE); 
     } 
    }); 

    holder.btn_use.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View vx) { 
      new SweetAlertDialog(context, SweetAlertDialog.SUCCESS_TYPE) 
        .setTitleText("Success!") 
        .setContentText("asd") 
        .show(); 
     } 
    }); 
} 

ответ

1

Для это вы должны сохранить позицию позиции, которую вы нажали, скажем int mClickedPosition

onBindViewHolder() затем в методе, вы должны проверить, если текущая позиция такой же, как mClickedPosition, просто сделать expandedview к ВИДИМОМУ, еще на другую позицию, сделать его GONE.

внутри onBindViewHolder, вы должны проверить, что-то вроде этого

if (mClickedPosition == position) { 
     holder.base_card.setVisibility(View.GONE); 
     holder.expanded_card.setVisibility(View.VISIBLE); 
    } else { 
     holder.base_card.setVisibility(View.VISIBLE); 
     holder.expanded_card.setVisibility(View.GONE); 
    } 

обновляется весь образец кода адаптера в соответствии с просьбой:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 


    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     View content_view = inflater.inflate(R.layout.list_item,parent,false); 
     MyViewHolder holder = new MyViewHolder(content_view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(final MyViewHolder holder, int position) { 
     holder.base_card.setVisibility(View.VISIBLE); 
     holder.expanded_card.setVisibility(View.GONE); 
     final int p = position; 
     String s = "hasif";//card_list.get(p).card_name; 
     // final String sx = s.substring(1); //The 1st position [index 0] stores the rarity of the card, so remove that from the string to get the name 
     holder.tv_card.setText(s); 
     //holder.iv_card.setImageResource(card_list.get(p).card_img); 

     //RV_Animator.animate(holder); 

     holder.iv_card.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       holder.expanded_card.setVisibility(View.VISIBLE); 
       holder.base_card.setVisibility(View.GONE); 

       for (int ix =0; ix<getItemCount();ix++){ 
        if (ix!=p){ 
         notifyItemChanged(ix); 
        } 
       } 

      } 
     }); 

     holder.expanded_card.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View vy) { 
       holder.expanded_card.setVisibility(View.GONE); 
       holder.base_card.setVisibility(View.VISIBLE); 
      } 
     }); 

     holder.btn_use.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View vx) { 
       //Toast.makeText() 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return 3; 
    } 

    public static class MyViewHolder extends RecyclerView.ViewHolder { 

     private ImageView iv_card; 
     private TextView tv_card; 
     private RelativeLayout expanded_card; 
     private RelativeLayout base_card; 
     private Button btn_use; 
     public MyViewHolder(View itemView) { 
      super(itemView); 
      iv_card = (ImageView) itemView.findViewById(R.id.iv_card); 
      tv_card = (TextView) itemView.findViewById(R.id.tv_card); 
      expanded_card = (RelativeLayout) itemView.findViewById(R.id.expanded_card); 
      base_card = (RelativeLayout) itemView.findViewById(R.id.base_card); 
      btn_use = (Button) itemView.findViewById(R.id.btn_use); 

     } 
    } 
} 
+0

Hi Hasif, спасибо за ответ. Я не следую вашему ответу, не 'onBindViewHolder()' вызывается для каждой позиции карты? Тогда позиция была бы заданной. Если не все карты, основанные на моем коде, будут меняться на расширенный вид. Цените, если вы уточните, если я не понимаю. –

+0

@ImranHamid Да метод onBindViewHolder() будет вызываться для каждого элемента, но вы должны показать расширенный просмотр только для этого элемента, который был выбран пользователем, поэтому вам нужно проверить этот элемент позиции при вызове onBindViewHolder, проверить мой отредактированный ответ выше –

+0

моей главной проблемой на самом деле является центральная и правая карты, которые становятся «длиннее». Базовый макет - 'wrap_content' вокруг' ImageView'. Когда моя 1-я карта будет установлена ​​на расширенный макет, вы увидите, что у другой 2-карты больше нет стиля 'wrap_content' –

0
@Override 
public int getItemViewType(int position) { 
    //More to come 
} 

Override этот метод в RecyclerAdapter и передать Надлежащая int type ViewType

@Override 

общественный RecyclerView.ViewHolder onCreateViewHolder (ViewGroup ViewGroup, внутр viewType) {

RecyclerView.ViewHolder viewHolder; 
    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); 

    switch (viewType) { 
     case USER: 
      View v1 = inflater.inflate(R.layout.layout_viewholder1, viewGroup, false); 
      viewHolder = new ViewHolder1(v1); 
      break; 
     case IMAGE: 
      View v2 = inflater.inflate(R.layout.layout_viewholder2, viewGroup, false); 
      viewHolder = new ViewHolder2(v2); 
      break; 
     default: 
      View v = inflater.inflate(android.R.layout.simple_list_item_1, viewGroup, false); 
      viewHolder = new RecyclerViewSimpleTextViewHolder(v); 
      break; 
    } 
    return viewHolder; 

}

Inflate соответствующее представление, основанное на viewType

см ссылку: https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView

+0

Hi Milind, макет карты .xml не меняется. Он просто устанавливает некоторые компоненты макета либо в VISIBLE, либо GONE. Я считаю, что мне не требуется 2 viewTypes. –