本篇内容主要讲解“Android MVVM架构怎么实现RecyclerView列表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android MVVM架构怎么实现RecyclerView列表”吧!
implementation 'androidx.recyclerview:recyclerview:1.1.0'
dataBinding {
enabled = true
}
继承被观察者模式BaseObservable
@Bindable绑定字段
刷新数据 notifyPropertyChanged( BR.mName );//BR自动生成
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 );
}
}
将视图层与数据层绑定
@{information.mName}
导入实体类
<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>
引入数据源
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 );
}
设置数据
@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;
}
定义接口
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
继承View.OnClickListener点击事件
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
获取接口实例
public ViewHolder(@NonNull ViewDataBinding binding,OnItemClickListener listener)
调用接口
@Override
public void onClick(View v) {
if (listener != null){
listener.onItemClick( v,getPosition() );
}
}
开放接口
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
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() );
}
}
}
}
实现OnItemClickListener接口
@Override
public void InitListener(){
adapter.setOnItemClickListener( new MyRecyclerView.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText( context,"位数:"+position,Toast.LENGTH_SHORT ).show();
}
} );
}
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,"位数:"+position,Toast.LENGTH_SHORT ).show();
}
} );
}
}
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) );
}
}
到此,相信大家对“Android MVVM架构怎么实现RecyclerView列表”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。