Android MVVM架構(gòu)實(shí)現(xiàn)RecyclerView列表詳解流程
效果圖

導(dǎo)入引用
導(dǎo)入Recyclerview依賴
implementation 'androidx.recyclerview:recyclerview:1.1.0'
導(dǎo)入dataBinding引用
dataBinding {
enabled = true
}
代碼解析
建立實(shí)體類
繼承被觀察者模式BaseObservable
@Bindable綁定字段
刷新數(shù)據(jù) notifyPropertyChanged( BR.mName );//BR自動(dòng)生成
public class Information extends BaseObservable {
public String mName;
public String mSex;
public String mAge;
public List<Information> informationList;
public Information(){
}
public Information(String mName,String mSex,String mAge){
this.mName = mName;
this.mSex = mSex;
this.mAge = mAge;
}
@Bindable
public String getmAge() {
return mAge;
}
@Bindable
public String getmName() {
return mName;
}
@Bindable
public String getmSex() {
return mSex;
}
/**
* @param mName*/
public void setmName(String mName) {
this.mName = mName;
notifyPropertyChanged( BR.mName );
}
@Bindable
public List<Information> getInformationList() {
return informationList;
}
/**
* @param mSex */
public void setmSex(String mSex) {
this.mSex = mSex;
notifyPropertyChanged( BR.mSex );
}
/**
* @param mAge */
public void setmAge(String mAge) {
this.mAge = mAge;
notifyPropertyChanged( BR.mAge );
}
/**
* @param informationList */
public void setInformationList(List<Information> informationList) {
this.informationList = informationList;
notifyPropertyChanged( BR.informationList );
}
}
將視圖層與數(shù)據(jù)層綁定
@{information.mName}
建立RecyclerView子項(xiàng)
導(dǎo)入實(shí)體類
<data>
<variable
name="information"
type="com.franzliszt.mvvmrecyclerview.model.Information" />
</data>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="information"
type="com.franzliszt.mvvmrecyclerview.model.Information" />
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:background="#F5F5F5">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:layout_marginTop="20dp"
android:background="@drawable/item_bg_style"
android:gravity="center"
android:paddingLeft="20dp">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:hint="名字"
android:text="@{information.mName}"/>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:hint="性別"
android:text="@{information.mSex}"/>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:hint="年齡"
android:text="@{information.mAge}"/>
</LinearLayout>
</LinearLayout>
</layout>
適配器
建立適配器
引入數(shù)據(jù)源
public MyRecyclerView(List<Information> informationList){
this.informationList = informationList;
}
插入布局文件
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewDataBinding binding = DataBindingUtil.inflate( LayoutInflater.from( parent.getContext()) , R.layout.recyclerview_item,parent,false);
return new ViewHolder( binding,mOnItemClickListener );
}
設(shè)置數(shù)據(jù)
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Information information = informationList.get( position );
holder.binding.setVariable( BR.information,informationList.get( position ));
holder.binding.executePendingBindings();
}
自定義ViewHolder類
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
ViewDataBinding binding = null;
OnItemClickListener listener;
public ViewHolder(@NonNull ViewDataBinding binding,OnItemClickListener listener) {
super( binding.getRoot() );
this.listener = listener;
this.binding = binding;
binding.getRoot().setOnClickListener( this );
}
public ViewDataBinding getBinding(){
return binding;
}
設(shè)置子項(xiàng)點(diǎn)擊事件
定義接口
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
繼承View.OnClickListener點(diǎn)擊事件
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
獲取接口實(shí)例
public ViewHolder(@NonNull ViewDataBinding binding,OnItemClickListener listener)
調(diào)用接口
@Override
public void onClick(View v) {
if (listener != null){
listener.onItemClick( v,getPosition() );
}
}
開放接口
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
adapter全部代碼
public class MyRecyclerView extends RecyclerView.Adapter<MyRecyclerView.ViewHolder>{
private List<Information> informationList;
private OnItemClickListener mOnItemClickListener;
public MyRecyclerView(List<Information> informationList){
this.informationList = informationList;
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewDataBinding binding = DataBindingUtil.inflate( LayoutInflater.from( parent.getContext()) , R.layout.recyclerview_item,parent,false);
return new ViewHolder( binding,mOnItemClickListener );
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Information information = informationList.get( position );
holder.binding.setVariable( BR.information,informationList.get( position ));
holder.binding.executePendingBindings();
}
@Override
public int getItemCount() {
return informationList.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
ViewDataBinding binding = null;
OnItemClickListener listener;
public ViewHolder(@NonNull ViewDataBinding binding,OnItemClickListener listener) {
super( binding.getRoot() );
this.listener = listener;
this.binding = binding;
binding.getRoot().setOnClickListener( this );
}
public ViewDataBinding getBinding(){
return binding;
}
@Override
public void onClick(View v) {
if (listener != null){
listener.onItemClick( v,getPosition() );
}
}
}
}
建立VM層
子項(xiàng)點(diǎn)擊事件的使用
實(shí)現(xiàn)OnItemClickListener接口
@Override
public void InitListener(){
adapter.setOnItemClickListener( new MyRecyclerView.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText( context,"位數(shù):"+position,Toast.LENGTH_SHORT ).show();
}
} );
}
VM層代碼
public class ViewModel implements IViewModel{
public Information information;
public List<Information> mList = new ArrayList<>( );
private RecyclerView recyclerView;
private Context context;
private MyRecyclerView adapter;
public ViewModel(Information information, RecyclerView recyclerView, Context context){
this.information = information;
this.recyclerView = recyclerView;
this.context = context;
InitRecyclerView();
InitData();
InitListener();
}
private void InitRecyclerView(){
recyclerView.setLayoutManager( new LinearLayoutManager( context ) );
adapter = new MyRecyclerView( mList );
recyclerView.setAdapter( adapter );
}
@Override
public void InitData() {
for (int i = 0; i < 10; i++) {
mList.add( new Information( "張三"+i,"男",i+"" ) );
Log.d( "TAG",mList.get( i ).mName+"" );
}
information.setInformationList( mList );
}
@Override
public void InitListener(){
adapter.setOnItemClickListener( new MyRecyclerView.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText( context,"位數(shù):"+position,Toast.LENGTH_SHORT ).show();
}
} );
}
}
數(shù)據(jù)與視圖交互
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
binding = DataBindingUtil.setContentView( this,R.layout.activity_main );
binding.setViewmodel( new ViewModel(new Information( ),binding.myRecyclerView,MainActivity.this) );
}
}
到此這篇關(guān)于Android MVVM架構(gòu)實(shí)現(xiàn)RecyclerView列表詳解流程的文章就介紹到這了,更多相關(guān)Android RecyclerView列表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Studio 2020新版本卡在Gradle downloading/sync failed/下載緩慢/
Android Studio 2020新版本 卡在Gradle downloading / sync failed / 下載緩慢 / 下載超時(shí) 親測(cè)有效解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-12-12
android 跳轉(zhuǎn)進(jìn)市場(chǎng)的實(shí)現(xiàn)代碼
本篇文章是對(duì)android中跳轉(zhuǎn)進(jìn)市場(chǎng)的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
android開發(fā)教程之實(shí)現(xiàn)toast工具類
這篇文章主要介紹了android開發(fā)中需要的toast工具類,需要的朋友可以參考下2014-05-05
Android自定義View實(shí)現(xiàn)圓形切圖效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓形切圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
點(diǎn)擊微信內(nèi)網(wǎng)頁a標(biāo)簽直接跳轉(zhuǎn)打開淘寶APP的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于如何實(shí)現(xiàn)點(diǎn)擊微信內(nèi)網(wǎng)頁a標(biāo)簽直接跳轉(zhuǎn)打開淘寶APP的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-11-11
Android應(yīng)用內(nèi)存優(yōu)化指南
內(nèi)存優(yōu)化是提升 Android 應(yīng)用性能和用戶體驗(yàn)的關(guān)鍵環(huán)節(jié),內(nèi)存泄漏、內(nèi)存抖動(dòng)、不合理的數(shù)據(jù)結(jié)構(gòu)或資源占用等問題都可能導(dǎo)致應(yīng)用卡頓、崩潰或后臺(tái)被殺,本文從常見問題場(chǎng)景、優(yōu)化方案、工具使用和最佳實(shí)踐四個(gè)方面深入解析,需要的朋友可以參考下2025-03-03
Android列表實(shí)現(xiàn)(1)_數(shù)組列表實(shí)例介紹
最近開始學(xué)習(xí)android的ui,先上幾個(gè)相關(guān)的例子,后續(xù)還會(huì)有更新,感興趣的朋友可以研究下2012-12-12
Android 實(shí)時(shí)監(jiān)測(cè)(監(jiān)聽)網(wǎng)絡(luò)連接狀態(tài)變化
這篇文章主要介紹了Android 實(shí)時(shí)監(jiān)測(cè)(監(jiān)聽)網(wǎng)絡(luò)連接狀態(tài)變化的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-06-06
Android實(shí)現(xiàn)Reveal圓形Activity轉(zhuǎn)場(chǎng)動(dòng)畫的完整步驟
這篇文章主要給大家介紹了關(guān)于Android Reveal圓形Activity轉(zhuǎn)場(chǎng)動(dòng)畫的實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11

