回答

1

的build.gradle應用級

compile 'com.android.support:recyclerview-v7:25.0.0' 
    compile 'com.android.support:cardview-v7:25.0.0' 
    compile 'com.android.support:design:25.0.0' 
    compile 'com.jakewharton:butterknife:8.4.0' 
    apt 'com.jakewharton:butterknife-compiler:8.4.0' 
    compile 'com.github.bumptech.glide:glide:3.7.0' 
    compile 'de.hdodenhof:circleimageview:2.0.0' 

ItemModel.java

public class ItemModel { 

    private String name; 
    private String imagePath; 

    public ItemModel(){ 

    } 

    public ItemModel(String name, String imagePath) { 
     this.name = name; 
     this.imagePath = imagePath; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getImagePath() { 
     return imagePath; 
    } 

    public void setImagePath(String imagePath) { 
     this.imagePath = imagePath; 
    } 
} 

MainActivity.java

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.DividerItemDecoration; 
import android.support.v7.widget.GridLayoutManager; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 

import java.util.ArrayList; 
import java.util.List; 

import butterknife.BindView; 
import butterknife.ButterKnife; 

public class MainActivity extends AppCompatActivity { 


    String imageUrl[] = Constant.image; 
    String names[] = Constant.name; 

    @BindView(R.id.my_recycler_view) 
    RecyclerView mRecyclerView; 
    private RecyclerAdapter mAdapter; 

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

     initView(); 
    } 

    private void initView() { 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 

     List list = getList(); 
     mAdapter = new RecyclerAdapter(this, list); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     mRecyclerView.setAdapter(mAdapter); 
     mRecyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL)); 
    } 

    private List getList() { 
     List list = new ArrayList<>(); 
     for (int i = 0; i < imageUrl.length; i++) { 
      ItemModel model = new ItemModel(); 
      model.setName(names[i]); 
      model.setImagePath(imageUrl[i]); 
      list.add(model); 
     } 
     return list; 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.switch_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     switch (id) { 
      case android.R.id.home: 
       finish(); 
       break; 
      case R.id.switch_view: 
       supportInvalidateOptionsMenu(); 
       boolean isSwitched = mAdapter.toggleItemViewType(); 
       mRecyclerView.setLayoutManager(isSwitched ? new LinearLayoutManager(this) : new GridLayoutManager(this, 2)); 
       mAdapter.notifyDataSetChanged(); 
       break; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.sunil.switchlisttogridrecyclerview.MainActivity"> 


    <android.support.v7.widget.RecyclerView 
     android:id="@+id/my_recycler_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical"/> 

</RelativeLayout> 

RecyclerAdapter.java

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.bumptech.glide.Glide; 

import java.util.List; 

import butterknife.BindView; 
import butterknife.ButterKnife; 

/** 
* Created by sunil on 12/10/16. 
*/ 

public class RecyclerAdapter extends RecyclerView.Adapter { 

    private List itemModels; 
    private Context context; 
    private static final int LIST_ITEM = 0; 
    private static final int GRID_ITEM = 1; 
    boolean isSwitchView = true; 

    public RecyclerAdapter(Context context, List itemModels) { 
     this.itemModels = itemModels; 
     this.context = context; 
    } 

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


    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 

     View itemView; 
     if (i == LIST_ITEM){ 
      itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout, null); 
     }else{ 
      itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_view_grid, null); 
     } 
     return new ItemViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     ItemModel model = itemModels.get(position); 
     initializeViews(model, holder, position); 
    } 

    @Override 
    public int getItemViewType (int position) { 
     if (isSwitchView){ 
      return LIST_ITEM; 
     }else{ 
      return GRID_ITEM; 
     } 
    } 

    public boolean toggleItemViewType() { 
     isSwitchView = !isSwitchView; 
     return isSwitchView; 
    } 



    private void initializeViews(ItemModel model, final RecyclerView.ViewHolder holder, int position) { 

     String imageUrl = model.getImagePath(); 
     if (imageUrl != null && !imageUrl.isEmpty()){ 
      Glide.with(context) 
        .load(imageUrl) 
        .into(((ItemViewHolder)holder).imageView); 

     } 
     ((ItemViewHolder)holder).name.setText(model.getName()); 
    } 

    public static class ItemViewHolder extends RecyclerView.ViewHolder { 

     @BindView(R.id.name) 
     TextView name; 
     @BindView(R.id.imageView) 
     ImageView imageView; 

     public ItemViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 
     } 
    } 
} 

item_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="10dp"> 
    <de.hdodenhof.circleimageview.CircleImageView 
     android:src="@mipmap/ic_launcher" 
     android:id="@+id/imageView" 
     android:layout_width="70dp" 
     android:layout_height="70dp" /> 
    <TextView 
     android:id="@+id/name" 
     android:text="name" 
     android:textStyle="bold" 
     android:layout_alignBaseline="@id/imageView" 
     android:layout_margin="10dp" 
     android:gravity="center_vertical" 
     android:layout_width="match_parent" 
     android:layout_height="60dp" 
     android:layout_toRightOf="@+id/imageView"/> 
</RelativeLayout> 

item_layout_grid.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="0dp"> 

    <RelativeLayout 
     android:padding="10dp" 
     android:layout_centerHorizontal="true" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_horizontal"> 

     <de.hdodenhof.circleimageview.CircleImageView 
      android:src="@mipmap/ic_launcher" 
      android:id="@+id/imageView" 
      android:layout_width="70dp" 
      android:layout_height="70dp" /> 

     <TextView 
      android:id="@+id/name" 
      android:text="name" 
      android:textStyle="bold" 
      android:layout_margin="10dp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/imageView"/> 

    </RelativeLayout> 
</RelativeLayout> 

enter image description here