2015-11-24 1 views
7

Voglio fare un GridLayout che quando uno dei suoi figli è Visibility è impostato su GONE, viene sostituito dal figlio successivo. enter image description hereAndroid: dimensione GridLayout e comportamento View.GONE

Questo non è un compito che ho disegnato io stesso per spiegare meglio.

Posso ottenere il layout di lavoro come in numero di colonne e larghezza e tutto. Solo il comportamento predefinito GONE di GridLayout fa scomparire il bambino invece di essere sostituito come se non fosse lì in primo luogo, come funzionano gli altri layout.

Ho provato un sacco di roba, ho provato a cercare SO e google, ma non riesco a capirlo. E questo sarebbe il layout più conveniente per l'app su cui sto lavorando. È comunque necessario farlo nel layout senza doverlo fare a livello di programmazione? O forse una combinazione di entrambi?

risposta

2

La soluzione sarebbe utilizzare RecyclerView insieme a GridLayoutManager. La chiave è informare l'adattatore delle modifiche agli elementi eliminati utilizzando notifyItemRemoved. C'è un sacco di spazio per la personalizzazione in RecyclerViews, come belle animazioni per scomparire oggetti, riorganizzazione di oggetti rimanenti sullo schermo, decorazioni per oggetti e così via. È possibile applicare tutte queste personalizzazioni e logica aggiuntiva all'eliminazione degli elementi necessari per il proprio particolare problema.

Attività

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; 
    } 
} 

adattatore

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; 
    } 
} 

layout Attività

<?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> 

Griglia Articolo

<?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"/> 

Risultati Prima: Before

Dopo aver fatto clic su 4. Su un dispositivo vero e proprio, si sarà in grado di vedere una bella animazione quadro di questa azione.

After

3

Risolvere stesso problema:

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

Se non è necessario girare la vista di nuovo visibile si può risolvere rimuovendo la vista dal 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; 
     } 
    } 
} 
Problemi correlati