2015-11-24 6 views
7

Ich möchte eine GridLayout machen, dass, wenn eines der Kinder Visibility auf GONE festgelegt ist, wird es durch das nächste Kind ersetzt. enter image description hereAndroid: GridLayout Größe und View.GONE Verhalten

Dies ist keine Aufgabe, die ich selbst zeichnete, um besser zu erklären.

Ich kann das Layout arbeiten, wie in Anzahl der Spalten und Breite und alle. Nur der Standard GONE Verhalten von GridLayout lässt das Kind einfach verschwinden anstatt ersetzt zu werden, als ob es nicht an erster Stelle wäre, wie andere Layouts funktionieren.

Ich habe eine Menge Zeug versucht, ich habe versucht, SO und Google zu suchen, aber ich kann nicht scheinen, dies auszuarbeiten. Und das wäre das praktischste Layout für die App, an der ich gerade arbeite.Gibt es das im Layout, ohne das programmatisch zu machen? Oder vielleicht eine Kombination aus beidem?

Antwort

2

Die Lösung wäre RecyclerView zusammen mit GridLayoutManager zu verwenden. Der Schlüssel besteht darin, den Adapter über die Änderungen an gelöschten Elementen mithilfe von notifyItemRemoved zu benachrichtigen. In RecyclerViews gibt es viel Platz für Anpassungen, wie zum Beispiel nette Animationen für das Verschwinden von Gegenständen, Neuanordnung von verbleibenden Gegenständen auf dem Bildschirm, Gegenstandsdekorationen usw. Sie können all diese Anpassungen und zusätzliche Logik auf das Löschen der Gegenstände anwenden Problem.

Aktivität

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

Adapter

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

Aktivität Layout-

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

Grid Artikel

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

Ergebnisse Vorher: Before

Nach Klick auf 4. Auf einem Gerät, werden Sie eine schöne Rahmen Animation für diese Aktion sehen können.

After

3

Lösen gleiche Problem wie:

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

Wenn Sie die Ansicht wieder sichtbar nicht drehen müssen Sie es entfernen Sie den Blick von Grid lösen können.

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