2016-04-10 14 views
0

GridLayoutManagerを使用してRecyclerViewを作成しました。ボタンをクリックするたびにグリッドにカスタムビューを追加したい、各ビューに異なるIDが必要です。クリックすると破壊されます。Android:グリッドにビューを追加するRecyclerView

私は5つのビューを追加し、それを破壊するために3番目のビューをクリックすると、次回にビューを追加するときに6番目のビューの代わりに3番目のビューを追加します。

カスタムビューレイアウト(grid_item_button.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:background="#864643"> 

<Button 
    android:id="@+id/grid_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

<EditText 
    android:id="@+id/editName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:ems="2" 
    android:textColor="#ffffff"/> 

<TextView 
    android:id="@+id/ClassName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:text="hmm" 
    android:textColor="#ffffff"/> 

MyAdapter.java

class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private List<String> items = new ArrayList<>(); 

    public void addItem(String name) { 
     items.add(name); 
     notifyItemInserted(items.size() - 1); 
    } 

    public void removeItem(int position) { 
     items.remove(position); 
     notifyItemRemoved(position); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     View view = inflater.inflate(R.layout.grid_item_button, parent, false); 

     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
    } 

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


    static int i; 

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     private Button button; 
     private TextView ClassName; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      ClassName = (TextView) itemView.findViewById(R.id.ClassName); 
      button = (Button) itemView.findViewById(R.id.grid_button); 
      button.setOnClickListener(this); 
      ClassName.setId(++i); 
     } 

     @Override 
     public void onClick(View v) { 
      removeItem(getAdapterPosition()); 
     } 
    } 

} 

activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="m.testingsubjects.MainActivity"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <Button 
      android:id="@+id/button_add_item" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <android.support.v7.widget.RecyclerView 
      android:layout_marginTop="50dp" 
      android:id="@+id/recycler_view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 

    </LinearLayout> 

</ScrollView> 

MainActivity.java

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


    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
    assert recyclerView != null; 
    recyclerView.setLayoutManager(new GridLayoutManager(this, NUMBER_COLUMNS)); 
    recyclerView.addItemDecoration(new SampleItemDecoration()); 
    final MyAdapter adapter = new MyAdapter(); 
    recyclerView.setAdapter(adapter); 
    recyclerView.setNestedScrollingEnabled(false); 

    adapter.addItem(""); 

    findViewById(R.id.button_add_item).setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      adapter.addItem(""); 
     } 
    }); 


} 

だから私は必要なもの、それはそれが起こっているように見えるものですとしてだけtemporarlyそれを取り除くのではなく、クリックされていますとき、ビューを破壊することです。

答えて

1

onBindViewHolderが実装されていません。 Androidはこれを使用して再利用されるビューのコンテンツを更新するので重要です。確認onBindViewHolder documentation

正確に起こっていることは、第6のコンテンツを第3のビューに追加することです(破壊されているため、システムはこのリソースを再利用したいからです)。しかし、コンテンツをリフレッシュして以前の1。

Androidは、アダプタ内のすべてのデータを表示するために複数のビューしか使用しません。 RecycleViewに新しいViewHolderが必要な場合はonCreateViewHolderが呼び出され、それ以外の場合はonBindViewHolderが使用され、再利用されるコンテンツの更新方法を指定する必要があります。ViewHolder

関連する問題