├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── CardViewDemo.iml ├── README.md ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── coder │ │ └── cardviewdemo │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── coder │ │ └── cardviewdemo │ │ ├── MainActivity.java │ │ ├── News.java │ │ ├── NewsActivity.java │ │ └── RecyclerViewAdapter.java │ └── res │ ├── layout │ ├── activity_main.xml │ ├── activity_news.xml │ └── news_item.xml │ ├── menu │ └── menu_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── news_four.jpg │ ├── news_one.jpg │ ├── news_three.jpg │ ├── news_two.png │ └── screenshot.gif │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | /captures 8 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | CardViewDemo -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CardViewDemo.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CardViewDemo 2 | 通过RecyclerView,CardView实现简单的新闻卡片样式,更多参考个人主页和CSDN博客 3 | 4 | 个人博客:http://blog.csdn.net/qwm8777411 5 | 6 | 个人主页:http://www.jycoder.com 7 | 8 | 9 | [Material Design:利用RecyclerView CardView实现新闻卡片样式](http://blog.csdn.net/qwm8777411/article/details/46490455) 10 | 11 | 12 | Hope you will like it :) 13 | 14 | 15 | Screenshot 16 | ========================== 17 | 18 | 19 | 20 | 21 | 微信公众号ITBird 22 | ========================== 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 22 5 | buildToolsVersion "22.0.0" 6 | 7 | defaultConfig { 8 | applicationId "com.coder.cardviewdemo" 9 | minSdkVersion 14 10 | targetSdkVersion 22 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | compile 'com.android.support:appcompat-v7:22.2.0' 25 | compile 'com.android.support:cardview-v7:22.2.0' 26 | compile 'com.android.support:recyclerview-v7:22.2.0' 27 | } 28 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Software Donwland\adt-bundle-windows-x86_64-20140321\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/coder/cardviewdemo/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.coder.cardviewdemo; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/coder/cardviewdemo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.coder.cardviewdemo; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.support.v7.widget.LinearLayoutManager; 6 | import android.support.v7.widget.RecyclerView; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | public class MainActivity extends AppCompatActivity { 12 | 13 | private RecyclerView recyclerView; 14 | private List newsList; 15 | private RecyclerViewAdapter adapter; 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_main); 21 | 22 | LinearLayoutManager layoutManager=new LinearLayoutManager(this); 23 | 24 | 25 | recyclerView= (RecyclerView) findViewById(R.id.recyclerView); 26 | 27 | initPersonData(); 28 | adapter=new RecyclerViewAdapter(newsList,MainActivity.this); 29 | 30 | recyclerView.setHasFixedSize(true); 31 | recyclerView.setLayoutManager(layoutManager); 32 | recyclerView.setAdapter(adapter); 33 | 34 | 35 | 36 | } 37 | 38 | private void initPersonData() { 39 | newsList =new ArrayList<>(); 40 | 41 | newsList.add(new News(getString(R.string.news_one_title),getString(R.string.news_one_desc),R.mipmap.news_one)); 42 | newsList.add(new News(getString(R.string.news_two_title),getString(R.string.news_two_desc),R.mipmap.news_two)); 43 | newsList.add(new News(getString(R.string.news_three_title),getString(R.string.news_three_desc),R.mipmap.news_three)); 44 | newsList.add(new News(getString(R.string.news_four_title),getString(R.string.news_four_desc),R.mipmap.news_four)); 45 | } 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/coder/cardviewdemo/News.java: -------------------------------------------------------------------------------- 1 | package com.coder.cardviewdemo; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by QiWangming on 2015/6/13. 7 | */ 8 | public class News implements Serializable{ 9 | private String title; 10 | private String desc; 11 | private int photoId; 12 | 13 | /** 14 | * Constructs a new instance of {@code Object}. 15 | */ 16 | public News(String name, String age, int photoId) { 17 | this.title=name; 18 | this.desc=age; 19 | this.photoId=photoId; 20 | } 21 | 22 | public void setDesc(String desc) { 23 | this.desc = desc; 24 | } 25 | 26 | public void setTitle(String title) { 27 | this.title = title; 28 | } 29 | 30 | public void setPhotoId(int photoId) { 31 | this.photoId = photoId; 32 | } 33 | 34 | public String getDesc() { 35 | return desc; 36 | } 37 | 38 | public int getPhotoId() { 39 | return photoId; 40 | } 41 | 42 | public String getTitle() { 43 | return title; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/coder/cardviewdemo/NewsActivity.java: -------------------------------------------------------------------------------- 1 | package com.coder.cardviewdemo; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.widget.ImageView; 7 | import android.widget.TextView; 8 | 9 | /** 10 | * Created by QiWangming on 2015/6/13. 11 | */ 12 | public class NewsActivity extends AppCompatActivity { 13 | private ImageView newsPhoto; 14 | private TextView newsTitle; 15 | private TextView newsDesc; 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_news); 21 | 22 | newsPhoto= (ImageView) findViewById(R.id.news_info_photo); 23 | newsTitle= (TextView) findViewById(R.id.news_info_title); 24 | newsDesc= (TextView) findViewById(R.id.news_info_desc); 25 | 26 | Intent intent=getIntent(); 27 | 28 | News item= (News) intent.getSerializableExtra("News"); 29 | newsPhoto.setImageResource(item.getPhotoId()); 30 | newsTitle.setText(item.getTitle()); 31 | newsDesc.setText(item.getDesc()); 32 | 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/coder/cardviewdemo/RecyclerViewAdapter.java: -------------------------------------------------------------------------------- 1 | package com.coder.cardviewdemo; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.graphics.Color; 6 | import android.support.v7.widget.CardView; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.widget.Button; 12 | import android.widget.ImageView; 13 | import android.widget.TextView; 14 | 15 | import java.util.List; 16 | 17 | /** 18 | * Created by QiWangming on 2015/6/13. 19 | */ 20 | public class RecyclerViewAdapter extends RecyclerView.Adapter{ 21 | 22 | private List newses; 23 | private Context context; 24 | 25 | public RecyclerViewAdapter(List newses,Context context) { 26 | this.newses = newses; 27 | this.context=context; 28 | } 29 | 30 | 31 | //自定义ViewHolder类 32 | static class NewsViewHolder extends RecyclerView.ViewHolder{ 33 | 34 | CardView cardView; 35 | ImageView news_photo; 36 | TextView news_title; 37 | TextView news_desc; 38 | Button share; 39 | Button readMore; 40 | 41 | public NewsViewHolder(final View itemView) { 42 | super(itemView); 43 | cardView= (CardView) itemView.findViewById(R.id.card_view); 44 | news_photo= (ImageView) itemView.findViewById(R.id.news_photo); 45 | news_title= (TextView) itemView.findViewById(R.id.news_title); 46 | news_desc= (TextView) itemView.findViewById(R.id.news_desc); 47 | share= (Button) itemView.findViewById(R.id.btn_share); 48 | readMore= (Button) itemView.findViewById(R.id.btn_more); 49 | //设置TextView背景为半透明 50 | news_title.setBackgroundColor(Color.argb(20, 0, 0, 0)); 51 | 52 | } 53 | 54 | 55 | } 56 | @Override 57 | public RecyclerViewAdapter.NewsViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 58 | View v= LayoutInflater.from(context).inflate(R.layout.news_item,viewGroup,false); 59 | NewsViewHolder nvh=new NewsViewHolder(v); 60 | return nvh; 61 | } 62 | 63 | @Override 64 | public void onBindViewHolder(RecyclerViewAdapter.NewsViewHolder personViewHolder, int i) { 65 | final int j=i; 66 | 67 | personViewHolder.news_photo.setImageResource(newses.get(i).getPhotoId()); 68 | personViewHolder.news_title.setText(newses.get(i).getTitle()); 69 | personViewHolder.news_desc.setText(newses.get(i).getDesc()); 70 | 71 | //为btn_share btn_readMore cardView设置点击事件 72 | personViewHolder.cardView.setOnClickListener(new View.OnClickListener() { 73 | @Override 74 | public void onClick(View v) { 75 | Intent intent=new Intent(context,NewsActivity.class); 76 | intent.putExtra("News",newses.get(j)); 77 | context.startActivity(intent); 78 | } 79 | }); 80 | 81 | personViewHolder.share.setOnClickListener(new View.OnClickListener() { 82 | @Override 83 | public void onClick(View v) { 84 | Intent intent=new Intent(Intent.ACTION_SEND); 85 | intent.setType("text/plain"); 86 | intent.putExtra(Intent.EXTRA_SUBJECT, "分享"); 87 | intent.putExtra(Intent.EXTRA_TEXT, newses.get(j).getDesc()); 88 | intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 89 | context.startActivity(Intent.createChooser(intent, newses.get(j).getTitle())); 90 | } 91 | }); 92 | 93 | personViewHolder.readMore.setOnClickListener(new View.OnClickListener() { 94 | @Override 95 | public void onClick(View v) { 96 | Intent intent=new Intent(context,NewsActivity.class); 97 | intent.putExtra("News",newses.get(j)); 98 | context.startActivity(intent); 99 | } 100 | }); 101 | 102 | 103 | } 104 | 105 | @Override 106 | public int getItemCount() { 107 | return newses.size(); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_news.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 15 | 16 | 19 | 26 | 32 | 40 | 41 | 42 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/src/main/res/layout/news_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 21 | 25 | 31 | 42 | 43 | 44 | 51 | 56 |