我正在尝试将Android的数据绑定功能与自定义适配器和ListView一起使用.我无法覆盖自定义适配器的getView方法:
public class ChecksAdapter extends ArrayAdapter<Check> {
public ChecksAdapter(Context context, ObservableList<Check> checks) {
super(context, R.layout.check, checks);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CheckBinding binding = DataBindingUtil.inflate(
LayoutInflater.from(getContext()),
R.layout.check, parent, false);
binding.setCheck(this.getItem(position));
// Return what?
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
View我应该返回的元素?或者换句话说,如何将对象绑定到膨胀/转换视图?convertView使用数据绑定时如何重用?以下是本指南中ListViews的唯一参考:
如果您在ListView或RecyclerView适配器中使用数据绑定项,您可能更喜欢使用:
Run Code Online (Sandbox Code Playgroud)ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); //or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
我开发了基于android数据绑定库的应用程序:https://developer.android.com/topic/libraries/data-binding/index.html
class SignInViewModel extends BaseObservable {
@Bindable
public String getLogin() {
return login;
}
@Bindable
public String getPassword() {
return password;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想使用新库中的ViewModelProviders:https: //developer.android.com/topic/libraries/architecture/guide.html
SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModel.class);
Run Code Online (Sandbox Code Playgroud)
它如何结合?任何的想法?或者应该结合这两个库?
编辑
我改为:
class SignInViewModel extends ViewModel {
public ObservableField<String> login = new ObservableField<>("");
public ObservableField<String> password = new ObservableField<>("");
}
Run Code Online (Sandbox Code Playgroud)
现在编译,但问题是:它是正确的方式?
我正在使用Android的数据绑定库.我扩展了数据对象BaseObservable.
public static class SimpleData extends BaseObservable implements Serializable {
private String text, subText;
private SpannableString totalText;
@Bindable
public SpannableString getTotalText() {
return totalText;
}
public void setTotalText(SpannableString totalText) {
this.totalText = totalText;
notifyPropertyChanged(BR.totalText);
}
}
Run Code Online (Sandbox Code Playgroud)
我的xml也是绑定的
<TextView
android:id="@+id/patient_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_marginLeft="16dp"
android:layout_toRightOf="@+id/patient_image"
android:textColor="@color/primary_text"
android:text="@{object.getTotalText()}"
/>
Run Code Online (Sandbox Code Playgroud)
绑定发生在初始值上.但是当我使用更改值时
object.setTotalText(someSpannableString);
Run Code Online (Sandbox Code Playgroud)
更改不会反映在文本视图中.可能是什么问题呢?
我的工作DataBinding有BindingAdapter.这是我的自定义方法.
@BindingAdapter("{bind:fadevisible}")
public static void setFadeVisible(LinearLayout view, int visible) {
Log.e("Bindings", "setFadeVisible: ");
}
Run Code Online (Sandbox Code Playgroud)
在xml文件中,我称之为
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:fadevisible="@{1}"/>
Run Code Online (Sandbox Code Playgroud)
但它显示错误
错误:任务':app:compileDebugJavaWithJavac'的执行失败.java.lang.RuntimeException:发现数据绑定错误.****/数据绑定错误****消息:在android.widget.LinearLayout上找不到参数类型为int的属性'app:fadevisible'的setter.file:\ app\src\main\res-main\layout\activity_detail.xml loc:236:31 - 236:54****\data binding error****
我已经检查了这个和这个帖子,但不知怎的,它没有帮助我,因为你可以看到我int从xml 传递,并且BindingAdapter我也提到LinearLayout了int有价值.
即使我有另一种方法,只是参数不同,工作正常
@BindingAdapter({"bind:image_round"})
public static void loadRoundImage(ImageView imageView, String url)
Run Code Online (Sandbox Code Playgroud) 我正在开发一个具有标签布局作为图像的应用程序.
我想将MVVM架构与数据绑定库一起使用,但我是这个框架的新手.
我可以通过使用ViewPager作为此示例的常规设置选项卡布局而不使用MVVM来执行此操作.
没有MVVM和数据绑定的常规选项卡布局:
activity_main.xml中:
<android.support.design.widget.CoordinatorLayout 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="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:tabGravity="fill"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
Run Code Online (Sandbox Code Playgroud)
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) …Run Code Online (Sandbox Code Playgroud) data-binding android mvvm android-tablayout android-databinding
当我用一个Android项目切换时
classpath 'com.android.tools.build:gradle:3.2.0-alpha18'
至
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.50"
我遇到了
什么地方出了错:
在任务':detector:kaptDebugKotlin'的配置中发现了一些问题.
目录'〜/ project/build/intermediates/feature_data_binding_base_feature_info/debug/dataBindingExportFeaturePackageIdsDebug/out'为属性'annotationProcessorOptionProviders指定$ kotlin_gradle_plugin.$ 0. $ 0.baseFeatureInfoDir'不存在.为属性'databinding.baseFeatureInfoDir'指定的目录'〜/ project/build/intermediates/feature_data_binding_base_feature_info/debug/dataBindingExportFeaturePackageIdsDebug/out'不存在.
与classpath 'com.android.tools.build:gradle:3.1.3'它正常工作
我的顶级build.gradle:
buildscript {
ext.kotlin_version = '1.2.41'
ext.lifecycle_version = "1.1.1"
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
Run Code Online (Sandbox Code Playgroud)
我的项目级build.gradle:
android {
...
dataBinding {
enabled = true
}
}
dependencies {
...
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
}
Run Code Online (Sandbox Code Playgroud)
我还android.databinding.enableV2=true为每个Google文档添加了gradle.properties(https://developer.android.com/topic/libraries/data-binding/start)
当我尝试运行时,它Unresolved reference: BR在我的BaseViewHolder班级中显示错误.似乎BR已经正确生成了类,但是.../R.java当我将鼠标移到类名上时,它还会在文件中找到重复的类.我做错了什么?
fun bind(obj: Any) {
binding.setVariable(BR.obj, obj)
binding.executePendingBindings()
}
Run Code Online (Sandbox Code Playgroud) Android数据绑定提供了几个Observable数据接口,包括ObservableList.但SortedList(在最新版本的RecyclerView库中引入)根本不扩展List.
我如何使用SortedList for RecyclerView与Android数据绑定库?
我基于LinearLayout创建自定义视图.类扩展了LinearLayout类,我在布局中有:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<merge>
some staff here
</merge>
</layout>
Run Code Online (Sandbox Code Playgroud)
Android Studio会显示警告Element merge is not allowed here,但应用有效.
怎么了?
如果在编译期间有任何错误,则不会生成数据绑定类 - 因此,我得到了大量的错误,如下所示:
symbol: class DataBindingComponent
location: class TrainingActivityCompletedSetBinding
e: S:\ProjectLocation\TrainingActivityCompletedSetBinding.java:60: error: cannot find symbol
@Nullable DataBindingComponent component)
Run Code Online (Sandbox Code Playgroud)
问题是编译错误根本不与数据绑定有关,因此我不知道实际上是什么导致它 - 我必须手动挖掘文件才能找到问题.
在上面的例子中,我只是@Inject从需要它的构造函数中省略.在这种情况下看到来自Dagger的错误消息是很可爱的,这样我就可以立即找到它,而不必深入挖掘所有项目类来手动找到它.
任何帮助将大大感激!
Android Studio和数据绑定目前都是3.1.3版本,至少从3.0开始就出现了错误.
使用Kotlin V1.2.41和kapt生成代码.
尝试增加编译器显示的最大错误数,遗憾的是没有区别.
暂时,解决方法是android.databinding.enableV2=true在gradle.properties中简单地禁用数据绑定V2 : . 尽管如此,仍然需要更好的解决方案