目录效果图导入引用导入Recyclerview依赖导入dataBinding引用代码解析建立实体类建立RecyclerView子项适配器建立适配器设置子项点击事件adapter全部代
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;
}
public void setmName(String mName) {
this.mName = mName;
notifyPropertyChanged( BR.mName );
}
@Bindable
public List<Information> getInformationList() {
return informationList;
}
public void setmSex(String mSex) {
this.mSex = mSex;
notifyPropertyChanged( BR.mSex );
}
public void setmAge(String mAge) {
this.mAge = mAge;
notifyPropertyChanged( BR.mAge );
}
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列表详解流程的文章就介绍到这了,更多相关Android RecyclerView列表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Android MVVM架构实现RecyclerView列表详解流程
本文链接: https://lsjlt.com/news/155933.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-21
2023-10-28
2023-10-28
2023-10-27
2023-10-27
2023-10-27
2023-10-27
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0