2015-11-24 1 views
7

Je souhaite créer un GridLayout lorsque l'un de ses enfants Visibility est défini sur GONE, il est remplacé par le suivant. Android: taille GridLayout et comportement View.GONE

Ce n'est pas un devoir que j'ai dessiné moi-même pour mieux expliquer.

Je peux obtenir la mise en page en fonction du nombre de colonnes et de la largeur et tout. Juste le comportement par défaut GONE de GridLayout fait disparaître l'enfant au lieu d'être remplacé comme s'il n'était pas là en premier lieu, comme d'autres travaux de mise en page. J'ai essayé beaucoup de choses, j'ai essayé de chercher SO et google, mais je n'arrive pas à résoudre ce problème. Et ce serait la mise en page la plus pratique pour l'application sur laquelle je travaille.Est-ce qu'il y a de toute façon à le faire dans la mise en page sans avoir à le faire par programmation? Ou peut-être une combinaison des deux?

Répondre

2

La solution consisterait à utiliser RecyclerView avec GridLayoutManager. La clé consiste à informer l'adaptateur des modifications apportées aux éléments supprimés à l'aide de notifyItemRemoved. Il y a beaucoup de place pour la personnalisation dans RecyclerViews, comme de belles animations pour les objets disparus, le réarrangement des éléments restants sur l'écran, les décorations d'objets et etc. Vous pouvez appliquer toute cette personnalisation et logique supplémentaire autour de la suppression des éléments problème.

Activité

public class MainActivity extends AppCompatActivity { 
    RecyclerView recyclerView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     List<String> dataSet = getSampleDataSet(); 
     recyclerView = (RecyclerView) findViewById(R.id.grid); 
     recyclerView.setAdapter(new MyAdapter(dataSet)); 
     recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(), 2)); 
    } 

    private List<String> getSampleDataSet() { 
     List strings = new ArrayList(); 
     strings.add("one"); 
     strings.add("two"); 
     strings.add("three"); 
     strings.add("four"); 
     strings.add("five"); 
     strings.add("six"); 

     return strings; 
    } 
} 

Adaptateur

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { 
    List<String> dataSet; 



    public MyAdapter(List<String> dataSet) { 
     this.dataSet = dataSet; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     TextView tileView = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_item, parent, false); 
     MyViewHolder myViewHolder = new MyViewHolder(tileView); 

     return myViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 
     holder.view.setText(dataSet.get(position)); 

     holder.view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       dataSet.remove(position); 
       notifyItemRemoved(position); // this notifies the adapter about item being removed 
      } 
     }); 

    } 

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


class MyViewHolder extends RecyclerView.ViewHolder { 
    TextView view; 

    public MyViewHolder(TextView itemView) { 
     super(itemView); 
     view = itemView; 
    } 
} 

activité Mise en page

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/grid" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</RelativeLayout> 

Grille Article

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridItem" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:background="@color/colorPrimary" 
    android:textColor="@android:color/white" 
    android:gravity="center" 
    android:text="Tile"/> 

Résultats Avant: Before

Après avoir cliqué sur 4. Sur un périphérique réel, vous serez en mesure de voir une animation cadre agréable pour cette action.

After

3

Solve même problème que:

package ua.vsgroup.widgets; 

import android.content.Context; 
import android.support.v7.widget.GridLayout; 
import android.util.AttributeSet; 
import android.view.View; 

public class vsGridLayout extends GridLayout { 

    View[] mChild = null; 

    public vsGridLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public vsGridLayout(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public vsGridLayout(Context context) { 
     this(context, null); 
    } 

    private void arrangeElements() { 

     mChild = new View[getChildCount()]; 
     for (int i = 0; i < getChildCount(); i++) { 
      mChild[i] = getChildAt(i); 
     } 

     removeAllViews(); 
     for (int i = 0; i < mChild.length; i++) { 
      if (mChild[i].getVisibility() != GONE) 
       addView(mChild[i]); 
     } 
     for (int i = 0; i < mChild.length; i++) { 
      if (mChild[i].getVisibility() == GONE) 
       addView(mChild[i]); 
     } 

    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 

     arrangeElements(); 
     super.onLayout(changed, left, top, right, bottom); 

    } 


} 
0

Si vous n'avez pas besoin tourner la vue à nouveau visible, vous pouvez le résoudre enlever la vue de GridLayout.

private void hideView(View view) { 
    GridLayout gridLayout = (GridLayout) view.getParent(); 
    for (int i = 0; i < gridLayout.getChildCount(); i++) { 
     if (view == gridLayout.getChildAt(i)) { 
      gridLayout.removeViewAt(i); 
      break; 
     } 
    } 
}