Android RecyclerView和数据绑定不工作
这是我第一次尝试使用RecyclerView进行数据绑定,但不是我第一次使用RecyclerView本身 由于某些原因,没有调用任何适配器方法-甚至没有调用getItemCount()。 这可能是我的RecyclerView的一个愚蠢的问题,与数据绑定毫无关系,但我看不出任何错误Android RecyclerView和数据绑定不工作,android,android-custom-view,android-recyclerview,android-databinding,Android,Android Custom View,Android Recyclerview,Android Databinding,这是我第一次尝试使用RecyclerView进行数据绑定,但不是我第一次使用RecyclerView本身 由于某些原因,没有调用任何适配器方法-甚至没有调用getItemCount()。 这可能是我的RecyclerView的一个愚蠢的问题,与数据绑定毫无关系,但我看不出任何错误 View rootview = inflater.inflate(R.layout.fragment_profile_first, container, false); // Initialize
View rootview = inflater.inflate(R.layout.fragment_profile_first, container, false);
// Initialize recycler view
RecyclerView badgesRV = (RecyclerView) rootview.findViewById(R.id.badgesRV);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
llm.setOrientation(LinearLayoutManager.HORIZONTAL);
badgesRV.setLayoutManager(llm);
BadgeAdapter badgeAdapter = new BadgeAdapter(profileObject.badgesEntity.badges);
badgesRV.setAdapter(badgeAdapter);
适配器:
public class BadgeAdapter extends RecyclerView.Adapter<BadgeAdapter.BadgeBindingHolder>{
private static final int MAX_BADGES_TO_DISPLAY = 5;
private BadgeObject[] badges;
public BadgeAdapter(BadgeObject[] badges){
this.badges = badges;
}
@Override
public BadgeBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.profile_badge_row, parent, false);
BadgeBindingHolder holder = new BadgeBindingHolder(v);
return holder;
}
@Override
public void onBindViewHolder(BadgeBindingHolder holder, int position) {
final BadgeObject badgeObject = badges[position];
holder.getBinding().setVariable(BR.badge, badgeObject);
holder.getBinding().executePendingBindings();
}
@Override
public int getItemCount() {
Log.d(TAG, "item count = " + Math.min(MAX_BADGES_TO_DISPLAY, badges.length));
return Math.min(MAX_BADGES_TO_DISPLAY, badges.length);
}
public class BadgeBindingHolder extends RecyclerView.ViewHolder{
private ViewDataBinding binding;
public BadgeBindingHolder(View rowView) {
super(rowView);
binding = DataBindingUtil.bind(rowView);
}
public ViewDataBinding getBinding() {
return binding;
}
}
}
这会显示一条消息,说明找不到ProfileBadgesLayoutBinding。在您的
onCreateViewHolder
中:
@Override
public BadgeBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ProfileBadgeRowBinding binding = DataBindingUtil.inflate(inflater, R.layout.profile_badge_row, parent, false);
BadgeBindingHolder holder = new BadgeBindingHolder(binding.getRoot(), binding);
return holder;
}
并在项目视图中添加绑定
public class BadgeBindingHolder extends RecyclerView.ViewHolder{
private ProfileBadgeRowBinding binding;
public BadgeBindingHolder(View rowView, ProfileBadgeRowBinding binding) {
super(rowView);
this.binding = binding;
}
...
}
并在bindToViewHolder
中设置变量
@Override
public void bindToViewHolder(RecyclerView.ViewHolder viewHolder) {
ProfileBadgeRowBinding binding = ((BadgeBindingHolder) viewHolder).binding;
binding.setVariable(BR.badge, badge);
binding.executePendingBindings(); // This line is important, it will force to load the variable in a custom view
}
如果要访问视图,请向
xml
中的视图添加id
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="badge" type="parseJsonEntities.requestObjects.BadgeObject"/>
</data>
<LinearLayout
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
有关自定义视图的更多信息现在,这样做要容易得多, 请遵循以下示例:
public class LanguageRecyclerAdapter extends RecyclerView.Adapter<LanguageRecyclerAdapter.LanguageViewHolder> {
private List<Language> languages;
public class LanguageViewHolder extends RecyclerView.ViewHolder {
final LanguageSetItemBinding item;
public void bind(final Language language) {
item.setLanguage(language.getName());
item.setFlag(language.getFlagRes());
item.getRoot().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//do somthing if you need
}
});
item.executePendingBindings();
}
public LanguageViewHolder(LanguageSetItemBinding itemView) {
super(itemView.getRoot());
item =itemView;
}
}
public LanguageRecyclerAdapter(List<Language> languages) {
this.languages = languages;
}
public void onBindViewHolder(LanguageViewHolder holder, int position) {
Language item = languages.get(position);
holder.bind(item);
}
public LanguageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
LanguageSetItemBinding item = LanguageSetItemBinding.inflate(layoutInflater, parent,false);
return new LanguageViewHolder(item);
}
@Override
public int getItemCount() {
return languages.size();
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
}
我有一个内部带有recyclerview的活动,在活动OmCreateView中,我将此回收器连接到我在上面创建的适配器:
final ArrayList<Language> lang = new ArrayList(languageList.values());
final LanguageRecyclerAdapter adapter = new LanguageRecyclerAdapter(lang);
mBinding.languageRecyclerView.setAdapter(adapter);
final ArrayList lang=new ArrayList(languageList.values());
最终LanguageRecyclerAdapter=新LanguageRecyclerAdapter(lang);
mBinding.languageRecyclView.setAdapter(适配器);
片段xml在哪里???RecyclerView
与数据绑定
完美结合,因为许多其他人在使用它时没有任何问题。你能把你的布局张贴在你的RecyclerView
所在的地方吗?其他滚动视图可能有一些奇怪的行为。还有,什么是badge.badgeImage
?一个资源id
,一个可绘制的
。?谢谢!我的问题是我没有使用binding.executePendingBindings();在我看来,这并不明显。非常感谢你!!!!由于数据绑定,所有适配器中都存在很多问题。你解决了。谢谢你的回答
@Override
public void bindToViewHolder(RecyclerView.ViewHolder viewHolder) {
ProfileBadgeRowBinding binding = ((BadgeBindingHolder) viewHolder).binding;
binding.setVariable(BR.badge, badge);
binding.executePendingBindings();
binding.image.setImage(...);
}
public class LanguageRecyclerAdapter extends RecyclerView.Adapter<LanguageRecyclerAdapter.LanguageViewHolder> {
private List<Language> languages;
public class LanguageViewHolder extends RecyclerView.ViewHolder {
final LanguageSetItemBinding item;
public void bind(final Language language) {
item.setLanguage(language.getName());
item.setFlag(language.getFlagRes());
item.getRoot().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//do somthing if you need
}
});
item.executePendingBindings();
}
public LanguageViewHolder(LanguageSetItemBinding itemView) {
super(itemView.getRoot());
item =itemView;
}
}
public LanguageRecyclerAdapter(List<Language> languages) {
this.languages = languages;
}
public void onBindViewHolder(LanguageViewHolder holder, int position) {
Language item = languages.get(position);
holder.bind(item);
}
public LanguageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
LanguageSetItemBinding item = LanguageSetItemBinding.inflate(layoutInflater, parent,false);
return new LanguageViewHolder(item);
}
@Override
public int getItemCount() {
return languages.size();
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
}
<?xml version="1.0" encoding="utf-8"?>
<layout >
<data>
<variable name="language" type="String" />
<variable name="flag" type="int" />
</data>
<android.widget.LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="166dp"
android:layout_height="166dp"
android:background="@color/colorWhite"
android:orientation="vertical"
android:layout_margin="20dp"
android:gravity="center">
<TextView
android:layout_marginTop="20dp"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="@{language}"
android:textColor="@color/colorBlack"
android:textAlignment="center"/>
<ImageView
android:textColor="?attr/errorColor"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@{context.getDrawable(flag)}"
android:gravity="center"
android:paddingTop="3dp"/>
</android.widget.LinearLayout>
</layout>
final ArrayList<Language> lang = new ArrayList(languageList.values());
final LanguageRecyclerAdapter adapter = new LanguageRecyclerAdapter(lang);
mBinding.languageRecyclerView.setAdapter(adapter);