1 介绍
滚动控件RecyclerView可以说是增强版的ListView。 其不仅可以轻松实现和ListView同样的效果,还优化了ListView中存在的各种不足。
2 导包
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
3 布局文件
3.1 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"></androidx.recyclerview.widget.RecyclerView>
</androidx.constraintlayout.widget.ConstraintLayout>
3.2 shop_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="5dp"
android:background="@drawable/selector_list_item"
android:gravity="center"
app:cardBackgroundColor="#fff"
app:cardCornerRadius="4dp"
app:contentPadding="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="120dp"
android:orientation="horizontal"
android:padding="5dp">
<ImageView
android:id="@+id/shop_image"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:layout_weight="2"
android:scaleType="fitXY" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:orientation="vertical">
<TextView
android:id="@+id/shop_name"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:maxLines="2"
android:text="6666666666666666666666666666666666666"
android:textColor="@color/base_color"
android:textSize="14sp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<TextView
android:id="@+id/text_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="价格"
android:textColor="@color/firebrick"
android:textSize="16sp" />
<TextView
android:id="@+id/text_stock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/text_price"
android:layout_marginLeft="30dp"
android:text=""
android:textSize="13sp" />
<TextView
android:id="@+id/text_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:text="数量" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
3.3 selector_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@color/gainsboro" />
<item android:state_pressed="true" android:drawable="@color/gainsboro" />
<item android:drawable="@color/white"/>
</selector>
3.4 colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="base_color">#505050</color>
<color name="firebrick">#b22222</color>
<color name="gainsboro">#dcdcdc</color>
</resources>
4 bean层
package com.example.study.bean;
public class ShopBean {
private String name;
private int imageID;
public ShopBean(String name, int imageID) {
this.name = name;
this.imageID = imageID;
}
public String getName() {
return name;
}
public int getImageID() {
return imageID;
}
}
5 适配器
package com.example.study.adapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.study.R;
import com.example.study.bean.ShopBean;
import java.util.List;
public class ShopAdapter extends RecyclerView.Adapter<ShopAdapter.ViewHolder> {
private List<ShopBean> mShopList;
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item, null);
ViewHolder holder = new ViewHolder(view);
return holder;
}
public ShopAdapter(List<ShopBean> shopList){
mShopList=shopList;
}
@Override
public void onBindViewHolder(@NonNull ShopAdapter.ViewHolder holder, int position) {
ShopBean shop = mShopList.get(position);
holder.shopImage.setImageResource(shop.getImageID());
holder.shopName.setText(shop.getName());
}
@Override
public int getItemCount() {
return mShopList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView shopImage;
TextView shopName;
public ViewHolder(@NonNull View itemView) {
super(itemView);
shopImage = itemView.findViewById(R.id.shop_image);
shopName = itemView.findViewById(R.id.shop_name);
}
}
}
6 MainActivity.java
package com.example.study;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.example.study.adapter.ShopAdapter;
import com.example.study.bean.ShopBean;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<ShopBean> shopList = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initShops();
RecyclerView recyclerView = findViewById(R.id.recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
ShopAdapter adapter = new ShopAdapter(shopList);
recyclerView.setAdapter(adapter);
}
private void initShops() {
for (int i = 0; i < 6; i++) {
ShopBean demo1 = new ShopBean("demo1", R.drawable.logo);
ShopBean demo2 = new ShopBean("demo2", R.drawable.ic_launcher);
ShopBean demo3 = new ShopBean("demo3", R.drawable.logo);
ShopBean demo4 = new ShopBean("demo4", R.drawable.ic_launcher);
ShopBean demo5 = new ShopBean("demo5", R.drawable.logo);
ShopBean demo6 = new ShopBean("demo6", R.drawable.ic_launcher);
shopList.add(demo1);
shopList.add(demo2);
shopList.add(demo3);
shopList.add(demo4);
shopList.add(demo5);
shopList.add(demo6);
}
}
}
7 效果

8 监听器 修改 ShopAdapter.java
不同于ListView的是,RecyclerView并没有提供类似于setOnItemClickListener()这样的注册监听器的方法,而我们自己给子项具体的view去注册点击事件,相比于ListView来说,实现起来要复杂些。为什么说EecyclerView在各方面的设计都要优于ListView。
RecyclerView干脆直接摒弃了子项点击事件监听器,所有的点击事件,都由具体的View去注册。
package com.example.study.adapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.study.R;
import com.example.study.bean.ShopBean;
import java.util.List;
public class ShopAdapter extends RecyclerView.Adapter<ShopAdapter.ViewHolder> {
private List<ShopBean> mShopList;
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item, null);
ViewHolder holder = new ViewHolder(view);
holder.shopView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getAdapterPosition();
ShopBean shop = mShopList.get(position);
Toast.makeText(view.getContext(), "你点击了" + shop.getName(), Toast.LENGTH_SHORT).show();
}
});
holder.shopImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getAdapterPosition();
ShopBean shop = mShopList.get(position);
Toast.makeText(view.getContext(), "你点击了" + shop.getName() + "的图片", Toast.LENGTH_SHORT).show();
}
});
return holder;
}
public ShopAdapter(List<ShopBean> shopList) {
mShopList = shopList;
}
@Override
public void onBindViewHolder(@NonNull ShopAdapter.ViewHolder holder, int position) {
ShopBean shop = mShopList.get(position);
holder.shopImage.setImageResource(shop.getImageID());
holder.shopName.setText(shop.getName());
}
@Override
public int getItemCount() {
return mShopList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
View shopView;
ImageView shopImage;
TextView shopName;
public ViewHolder(@NonNull View itemView) {
super(itemView);
shopView = itemView;
shopImage = itemView.findViewById(R.id.shop_image);
shopName = itemView.findViewById(R.id.shop_name);
}
}
}
9 点击效果

参考:
https://blog.csdn.net/qq_39326574/article/details/98098520
<h2><a id="1__0"></a>1 介绍</h2>
<p>滚动控件RecyclerView可以说是增强版的ListView。 其不仅可以轻松实现和ListView同样的效果,还优化了ListView中存在的各种不足。</p>
<h2><a id="2__4"></a>2 导包</h2>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">// 注入框架</span>
implementation <span class="hljs-string">'androidx.recyclerview:recyclerview:1.1.0'</span>
</code></div></pre>
<pre><div class="hljs"><code class="lang-java">implementation <span class="hljs-string">'com.android.support:recyclerview-v7:28.0.0'</span>
implementation <span class="hljs-string">'com.android.support:design:28.0.0'</span>
</code></div></pre>
<h2><a id="3__15"></a>3 布局文件</h2>
<h3><a id="31_activity_mainxml_17"></a>3.1 activity_main.xml</h3>
<ul>
<li>
<p>layout下</p>
</li>
<li>
<p>主文件</p>
</li>
</ul>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-meta"><?xml version="1.0" encoding="utf-8"?></span>
<span class="hljs-tag"><<span class="hljs-name">androidx.constraintlayout.widget.ConstraintLayout</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
<span class="hljs-attr">xmlns:app</span>=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span>
<span class="hljs-attr">xmlns:tools</span>=<span class="hljs-string">"http://schemas.android.com/tools"</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"match_parent"</span>
<span class="hljs-attr">tools:context</span>=<span class="hljs-string">".MainActivity"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">androidx.recyclerview.widget.RecyclerView</span>
<span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/recycler_view"</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"match_parent"</span>></span><span class="hljs-tag"></<span class="hljs-name">androidx.recyclerview.widget.RecyclerView</span>></span>
<span class="hljs-tag"></<span class="hljs-name">androidx.constraintlayout.widget.ConstraintLayout</span>></span>
</code></div></pre>
<h3><a id="32_shop_itemxml_39"></a>3.2 shop_item.xml</h3>
<ul>
<li>
<p>layout下</p>
</li>
<li>
<p>商品通用模板</p>
</li>
</ul>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-meta"><?xml version="1.0" encoding="utf-8"?></span>
<span class="hljs-tag"><<span class="hljs-name">LinearLayout</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
<span class="hljs-attr">xmlns:app</span>=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
<span class="hljs-attr">android:layout_gravity</span>=<span class="hljs-string">"center"</span>
<span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"5dp"</span>
<span class="hljs-attr">android:background</span>=<span class="hljs-string">"@drawable/selector_list_item"</span>
<span class="hljs-attr">android:gravity</span>=<span class="hljs-string">"center"</span>
<span class="hljs-attr">app:cardBackgroundColor</span>=<span class="hljs-string">"#fff"</span>
<span class="hljs-attr">app:cardCornerRadius</span>=<span class="hljs-string">"4dp"</span>
<span class="hljs-attr">app:contentPadding</span>=<span class="hljs-string">"5dp"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">LinearLayout</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"120dp"</span>
<span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"horizontal"</span>
<span class="hljs-attr">android:padding</span>=<span class="hljs-string">"5dp"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">ImageView</span>
<span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/shop_image"</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"0dp"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
<span class="hljs-attr">android:layout_marginRight</span>=<span class="hljs-string">"5dp"</span>
<span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"2"</span>
<span class="hljs-attr">android:scaleType</span>=<span class="hljs-string">"fitXY"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">LinearLayout</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"0dp"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"match_parent"</span>
<span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"3"</span>
<span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"vertical"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">TextView</span>
<span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/shop_name"</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"0dp"</span>
<span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"2"</span>
<span class="hljs-attr">android:maxLines</span>=<span class="hljs-string">"2"</span>
<span class="hljs-attr">android:text</span>=<span class="hljs-string">"6666666666666666666666666666666666666"</span>
<span class="hljs-attr">android:textColor</span>=<span class="hljs-string">"@color/base_color"</span>
<span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"14sp"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">RelativeLayout</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"0dp"</span>
<span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">TextView</span>
<span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/text_price"</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
<span class="hljs-attr">android:layout_alignParentBottom</span>=<span class="hljs-string">"true"</span>
<span class="hljs-attr">android:text</span>=<span class="hljs-string">"价格"</span>
<span class="hljs-attr">android:textColor</span>=<span class="hljs-string">"@color/firebrick"</span>
<span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"16sp"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">TextView</span>
<span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/text_stock"</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
<span class="hljs-attr">android:layout_alignParentBottom</span>=<span class="hljs-string">"true"</span>
<span class="hljs-attr">android:layout_toRightOf</span>=<span class="hljs-string">"@+id/text_price"</span>
<span class="hljs-attr">android:layout_marginLeft</span>=<span class="hljs-string">"30dp"</span>
<span class="hljs-attr">android:text</span>=<span class="hljs-string">""</span>
<span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"13sp"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">TextView</span>
<span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/text_num"</span>
<span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span>
<span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
<span class="hljs-attr">android:layout_alignParentRight</span>=<span class="hljs-string">"true"</span>
<span class="hljs-attr">android:layout_alignParentBottom</span>=<span class="hljs-string">"true"</span>
<span class="hljs-attr">android:text</span>=<span class="hljs-string">"数量"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">RelativeLayout</span>></span>
<span class="hljs-tag"></<span class="hljs-name">LinearLayout</span>></span>
<span class="hljs-tag"></<span class="hljs-name">LinearLayout</span>></span>
<span class="hljs-tag"></<span class="hljs-name">LinearLayout</span>></span>
</code></div></pre>
<h3><a id="33_selector_list_itemxml_126"></a>3.3 selector_list_item.xml</h3>
<ul>
<li>drawable目录下</li>
</ul>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-meta"><?xml version="1.0" encoding="utf-8"?></span>
<span class="hljs-tag"><<span class="hljs-name">selector</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">item</span> <span class="hljs-attr">android:state_focused</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">android:drawable</span>=<span class="hljs-string">"@color/gainsboro"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">item</span> <span class="hljs-attr">android:state_pressed</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">android:drawable</span>=<span class="hljs-string">"@color/gainsboro"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">item</span> <span class="hljs-attr">android:drawable</span>=<span class="hljs-string">"@color/white"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">selector</span>></span>
</code></div></pre>
<h3><a id="34_colorsxml_140"></a>3.4 colors.xml</h3>
<ul>
<li>values目录下</li>
</ul>
<pre><div class="hljs"><code class="lang-xml"><span class="hljs-meta"><?xml version="1.0" encoding="utf-8"?></span>
<span class="hljs-tag"><<span class="hljs-name">resources</span>></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"purple_200"</span>></span>#FFBB86FC<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"purple_500"</span>></span>#FF6200EE<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"purple_700"</span>></span>#FF3700B3<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"teal_200"</span>></span>#FF03DAC5<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"teal_700"</span>></span>#FF018786<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"black"</span>></span>#FF000000<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"white"</span>></span>#FFFFFFFF<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-comment"><!--userInfo font 主字体 颜色 --></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"base_color"</span>></span>#505050<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-comment"><!-- 暗金黄色 --></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"firebrick"</span>></span>#b22222<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-comment"><!-- 洋李色 --></span>
<span class="hljs-tag"><<span class="hljs-name">color</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"gainsboro"</span>></span>#dcdcdc<span class="hljs-tag"></<span class="hljs-name">color</span>></span>
<span class="hljs-tag"></<span class="hljs-name">resources</span>></span>
</code></div></pre>
<h2><a id="4_bean_164"></a>4 bean层</h2>
<ul>
<li>ShopBean .java</li>
</ul>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-keyword">package</span> com.example.study.bean;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ShopBean</span> {
<span class="hljs-keyword">private</span> String name;
<span class="hljs-keyword">private</span> <span class="hljs-type">int</span> imageID;
<span class="hljs-keyword">public</span> <span class="hljs-title function_">ShopBean</span><span class="hljs-params">(String name, <span class="hljs-type">int</span> imageID)</span> {
<span class="hljs-built_in">this</span>.name = name;
<span class="hljs-built_in">this</span>.imageID = imageID;
}
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">getName</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> name;
}
<span class="hljs-keyword">public</span> <span class="hljs-type">int</span> <span class="hljs-title function_">getImageID</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> imageID;
}
}
</code></div></pre>
<h2><a id="5__190"></a>5 适配器</h2>
<ul>
<li>ShopAdapter.java</li>
</ul>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-keyword">package</span> com.example.study.adapter;
<span class="hljs-keyword">import</span> android.util.Log;
<span class="hljs-keyword">import</span> android.view.LayoutInflater;
<span class="hljs-keyword">import</span> android.view.View;
<span class="hljs-keyword">import</span> android.view.ViewGroup;
<span class="hljs-keyword">import</span> android.widget.ImageView;
<span class="hljs-keyword">import</span> android.widget.TextView;
<span class="hljs-keyword">import</span> androidx.annotation.NonNull;
<span class="hljs-keyword">import</span> androidx.recyclerview.widget.RecyclerView;
<span class="hljs-keyword">import</span> com.example.study.R;
<span class="hljs-keyword">import</span> com.example.study.bean.ShopBean;
<span class="hljs-keyword">import</span> java.util.List;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ShopAdapter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">RecyclerView</span>.Adapter<ShopAdapter.ViewHolder> {
<span class="hljs-keyword">private</span> List<ShopBean> mShopList;
<span class="hljs-comment">/**
* onCreateViewHolder用于创建ViewHolder实例的,我们在这个方法中将shop_item布局加载进来,
* 然后创建一个ViewHolder实例,并把加载进来的方法的布局传入到构造函数中,最后将ViewHolder的实例返回
* */</span>
<span class="hljs-meta">@NonNull</span>
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> ViewHolder <span class="hljs-title function_">onCreateViewHolder</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> ViewGroup parent, <span class="hljs-type">int</span> viewType)</span> {
<span class="hljs-type">View</span> <span class="hljs-variable">view</span> <span class="hljs-operator">=</span> LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item, <span class="hljs-literal">null</span>);
<span class="hljs-type">ViewHolder</span> <span class="hljs-variable">holder</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ViewHolder</span>(view);
<span class="hljs-keyword">return</span> holder;
}
<span class="hljs-keyword">public</span> <span class="hljs-title function_">ShopAdapter</span><span class="hljs-params">(List<ShopBean> shopList)</span>{
mShopList=shopList;
}
<span class="hljs-comment">/**
* onBindViewHolder()方法是用于对RecyclerView子项的数据进行复制的,会在每个子项滚动到屏幕内的时候执行,
* 这里我们通过position参数得到当前的Shop实例,然后再讲数据设置到ViewHolder的ImageView和TextView当中即可。
* */</span>
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onBindViewHolder</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> ShopAdapter.ViewHolder holder, <span class="hljs-type">int</span> position)</span> {
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">shop</span> <span class="hljs-operator">=</span> mShopList.get(position);
holder.shopImage.setImageResource(shop.getImageID());
holder.shopName.setText(shop.getName());
}
<span class="hljs-comment">/**
* getItemCount()方法就很简单了,它用于告诉ReccylerView有多少子项,直接返回数据源的长度
* */</span>
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">int</span> <span class="hljs-title function_">getItemCount</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> mShopList.size();
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ViewHolder</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">RecyclerView</span>.ViewHolder {
ImageView shopImage;
TextView shopName;
<span class="hljs-keyword">public</span> <span class="hljs-title function_">ViewHolder</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> View itemView)</span> {
<span class="hljs-built_in">super</span>(itemView);
shopImage = itemView.findViewById(R.id.shop_image);
shopName = itemView.findViewById(R.id.shop_name);
}
}
}
</code></div></pre>
<h2><a id="6_MainActivityjava_265"></a>6 MainActivity.java</h2>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-keyword">package</span> com.example.study;
<span class="hljs-keyword">import</span> androidx.annotation.Nullable;
<span class="hljs-keyword">import</span> androidx.appcompat.app.AppCompatActivity;
<span class="hljs-keyword">import</span> androidx.recyclerview.widget.LinearLayoutManager;
<span class="hljs-keyword">import</span> androidx.recyclerview.widget.RecyclerView;
<span class="hljs-keyword">import</span> android.os.Bundle;
<span class="hljs-keyword">import</span> android.util.Log;
<span class="hljs-keyword">import</span> android.view.View;
<span class="hljs-keyword">import</span> com.example.study.adapter.ShopAdapter;
<span class="hljs-keyword">import</span> com.example.study.bean.ShopBean;
<span class="hljs-keyword">import</span> java.util.ArrayList;
<span class="hljs-keyword">import</span> java.util.List;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MainActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">AppCompatActivity</span> {
<span class="hljs-keyword">private</span> List<ShopBean> shopList = <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onCreate</span><span class="hljs-params">(<span class="hljs-meta">@Nullable</span> Bundle savedInstanceState)</span> {
<span class="hljs-built_in">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initShops();
<span class="hljs-type">RecyclerView</span> <span class="hljs-variable">recyclerView</span> <span class="hljs-operator">=</span> findViewById(R.id.recycler_view);
<span class="hljs-type">LinearLayoutManager</span> <span class="hljs-variable">layoutManager</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">LinearLayoutManager</span>(<span class="hljs-built_in">this</span>);
<span class="hljs-comment">// 设置方向</span>
<span class="hljs-comment">// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);</span>
recyclerView.setLayoutManager(layoutManager);
<span class="hljs-type">ShopAdapter</span> <span class="hljs-variable">adapter</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ShopAdapter</span>(shopList);
recyclerView.setAdapter(adapter);
}
<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">initShops</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i < <span class="hljs-number">6</span>; i++) {
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">demo1</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ShopBean</span>(<span class="hljs-string">"demo1"</span>, R.drawable.logo);
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">demo2</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ShopBean</span>(<span class="hljs-string">"demo2"</span>, R.drawable.ic_launcher);
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">demo3</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ShopBean</span>(<span class="hljs-string">"demo3"</span>, R.drawable.logo);
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">demo4</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ShopBean</span>(<span class="hljs-string">"demo4"</span>, R.drawable.ic_launcher);
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">demo5</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ShopBean</span>(<span class="hljs-string">"demo5"</span>, R.drawable.logo);
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">demo6</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ShopBean</span>(<span class="hljs-string">"demo6"</span>, R.drawable.ic_launcher);
shopList.add(demo1);
shopList.add(demo2);
shopList.add(demo3);
shopList.add(demo4);
shopList.add(demo5);
shopList.add(demo6);
}
}
}
</code></div></pre>
<h2><a id="7__322"></a>7 效果</h2>
<p><img src="https://static.couragesteak.com/article/0d5ad9fb9d60f16149ca0f8ad678d106.png" alt="安卓RecyclerView效果" /></p>
<h2><a id="8___ShopAdapterjava_326"></a>8 监听器 修改 ShopAdapter.java</h2>
<p>不同于ListView的是,RecyclerView并没有提供类似于setOnItemClickListener()这样的注册监听器的方法,而我们自己给子项具体的view去注册点击事件,相比于ListView来说,实现起来要复杂些。为什么说EecyclerView在各方面的设计都要优于ListView。<br />
RecyclerView干脆直接摒弃了子项点击事件监听器,所有的点击事件,都由具体的View去注册。</p>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-keyword">package</span> com.example.study.adapter;
<span class="hljs-keyword">import</span> android.util.Log;
<span class="hljs-keyword">import</span> android.view.LayoutInflater;
<span class="hljs-keyword">import</span> android.view.View;
<span class="hljs-keyword">import</span> android.view.ViewGroup;
<span class="hljs-keyword">import</span> android.widget.ImageView;
<span class="hljs-keyword">import</span> android.widget.TextView;
<span class="hljs-keyword">import</span> android.widget.Toast;
<span class="hljs-keyword">import</span> androidx.annotation.NonNull;
<span class="hljs-keyword">import</span> androidx.recyclerview.widget.RecyclerView;
<span class="hljs-keyword">import</span> com.example.study.R;
<span class="hljs-keyword">import</span> com.example.study.bean.ShopBean;
<span class="hljs-keyword">import</span> java.util.List;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ShopAdapter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">RecyclerView</span>.Adapter<ShopAdapter.ViewHolder> {
<span class="hljs-keyword">private</span> List<ShopBean> mShopList;
<span class="hljs-comment">/**
* onCreateViewHolder用于创建ViewHolder实例的,我们在这个方法中将shop_item布局加载进来,
* 然后创建一个ViewHolder实例,并把加载进来的方法的布局传入到构造函数中,最后将ViewHolder的实例返回
*/</span>
<span class="hljs-meta">@NonNull</span>
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> ViewHolder <span class="hljs-title function_">onCreateViewHolder</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> ViewGroup parent, <span class="hljs-type">int</span> viewType)</span> {
<span class="hljs-type">View</span> <span class="hljs-variable">view</span> <span class="hljs-operator">=</span> LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item, <span class="hljs-literal">null</span>);
<span class="hljs-type">ViewHolder</span> <span class="hljs-variable">holder</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ViewHolder</span>(view);
<span class="hljs-comment">// item的监视器</span>
holder.shopView.setOnClickListener(<span class="hljs-keyword">new</span> <span class="hljs-title class_">View</span>.OnClickListener() {
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onClick</span><span class="hljs-params">(View view)</span> {
<span class="hljs-type">int</span> <span class="hljs-variable">position</span> <span class="hljs-operator">=</span> holder.getAdapterPosition(); <span class="hljs-comment">// 获取点击的位置</span>
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">shop</span> <span class="hljs-operator">=</span> mShopList.get(position); <span class="hljs-comment">// 获取shop 商品</span>
Toast.makeText(view.getContext(), <span class="hljs-string">"你点击了"</span> + shop.getName(), Toast.LENGTH_SHORT).show();
}
});
<span class="hljs-comment">//imageView的监听器</span>
holder.shopImage.setOnClickListener(<span class="hljs-keyword">new</span> <span class="hljs-title class_">View</span>.OnClickListener() {
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onClick</span><span class="hljs-params">(View view)</span> {
<span class="hljs-type">int</span> <span class="hljs-variable">position</span> <span class="hljs-operator">=</span> holder.getAdapterPosition(); <span class="hljs-comment">// 获取点击位置</span>
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">shop</span> <span class="hljs-operator">=</span> mShopList.get(position); <span class="hljs-comment">// 获取shop</span>
Toast.makeText(view.getContext(), <span class="hljs-string">"你点击了"</span> + shop.getName() + <span class="hljs-string">"的图片"</span>, Toast.LENGTH_SHORT).show();
}
});
<span class="hljs-keyword">return</span> holder;
}
<span class="hljs-keyword">public</span> <span class="hljs-title function_">ShopAdapter</span><span class="hljs-params">(List<ShopBean> shopList)</span> {
mShopList = shopList;
}
<span class="hljs-comment">/**
* onBindViewHolder()方法是用于对RecyclerView子项的数据进行复制的,会在每个子项滚动到屏幕内的时候执行,
* 这里我们通过position参数得到当前的Shop实例,然后再讲数据设置到ViewHolder的ImageView和TextView当中即可。
*/</span>
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onBindViewHolder</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> ShopAdapter.ViewHolder holder, <span class="hljs-type">int</span> position)</span> {
<span class="hljs-type">ShopBean</span> <span class="hljs-variable">shop</span> <span class="hljs-operator">=</span> mShopList.get(position);
holder.shopImage.setImageResource(shop.getImageID());
holder.shopName.setText(shop.getName());
}
<span class="hljs-comment">/**
* getItemCount()方法就很简单了,它用于告诉ReccylerView有多少子项,直接返回数据源的长度
*/</span>
<span class="hljs-meta">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">int</span> <span class="hljs-title function_">getItemCount</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">return</span> mShopList.size();
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ViewHolder</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">RecyclerView</span>.ViewHolder {
View shopView; <span class="hljs-comment">// 监听相关:用来保存RecyclerView的子项最外层的实例</span>
ImageView shopImage;
TextView shopName;
<span class="hljs-keyword">public</span> <span class="hljs-title function_">ViewHolder</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> View itemView)</span> {
<span class="hljs-built_in">super</span>(itemView);
shopView = itemView; <span class="hljs-comment">// 监听相关:赋值</span>
shopImage = itemView.findViewById(R.id.shop_image);
shopName = itemView.findViewById(R.id.shop_name);
}
}
}
</code></div></pre>
<h2><a id="9__430"></a>9 点击效果</h2>
<p><img src="https://static.couragesteak.com/article/c49b49b027e34567c936816f1a5b0923.png" alt="RecyclerView效果 点击效果" /></p>
<p>参考:<br />
https://blog.csdn.net/qq_39326574/article/details/98098520</p>
留言