我开始修改我的应用程序以支持棒棒糖.基本上,我有一个带有recyclerview的文件浏览器片段,当用户打开这个片段时,他会看到他的根目录下的所有文件夹,当用户点击我需要获取所有子文件夹+文件的文件夹并将其显示给用户使用与notifydatachanged相同的recyclerview.功能正常的问题是当用户单击文件夹时,在notifydatachanged期间不保留涟漪效应.
file_item.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/file_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:drawablePadding="15dp"
android:ellipsize="marquee"
android:focusable="true"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingLeft="14dip"
android:paddingRight="15dip"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?android:attr/textColorAlertDialogListItem" />
Run Code Online (Sandbox Code Playgroud)
Recyclerview适配器:
public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.CustomViewHolder>{
private List<Item> _data;
private Context _context;
private IFileListener _listener;
public RecycleAdapter(Context context, List<Item> data,IFileListener listener) {
_data = data;
_context = context;
_listener = listener;
}
public void setData(List<Item> data)
{
_data = data;
notifyDataSetChanged();
}
@Override
public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(_context).inflate(R.layout.file_item, viewGroup,false);
CustomViewHolder viewHolder = new CustomViewHolder(view);
return …Run Code Online (Sandbox Code Playgroud) 我最近开始学习 Kotlin 中的视图模型和数据绑定。我创建了一个示例项目,在其中我在一个活动中创建了多个片段。我很想知道如何使用视图模型实现具有数据绑定的通用片段。我不确定这是否可能,或者我是否走在正确的道路上。我在网上搜索并找到了一些线索,但没有完整的解决方案。
到目前为止我所做的我创建了一个抽象的 BaseFragment。
abstract class BaseFragment<V : BaseViewModel> : Fragment()
{
lateinit var binding: FragmentHomeBinding
lateinit var viewModel : V
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate(inflater, getContentView(), container, false)
val view = binding.root
//here data must be an instance of the class MarsDataProvider
viewModel = ViewModelProviders.of(this).get(viewModel.javaClass)
setupUI()
binding.viewModel = viewModel
return view
}
abstract fun setupUI()
abstract fun getContentView() : Int
}
Run Code Online (Sandbox Code Playgroud)
这是 HomeFragment 的代码
class HomeFragment : BaseFragment<HomeViewModel>() …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用支持v4片段创建一个简单的匕首2应用程序.修改我的应用程序后,我得到了这个奇怪的编译错误
Error:(35, 8) error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<java.lang.Class<? extends android.support.v4.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>> cannot be provided without an @Provides-annotated method.
java.util.Map<java.lang.Class<? extends android.support.v4.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>> is injected at
dagger.android.DispatchingAndroidInjector.<init>(injectorFactories)
dagger.android.DispatchingAndroidInjector<android.support.v4.app.Fragment> is injected at
app.series.com.tvshowsapplication.ui.main.MainActivity.fragmentDispatchingAndroidInjector
app.series.com.tvshowsapplication.ui.main.MainActivity is injected at
dagger.android.AndroidInjector.inject(arg0)
Run Code Online (Sandbox Code Playgroud)
快速搜索后,我找到了这个链接.它说我需要使用
事情是我不明白我应该把这部分放在哪里
@Multibinds
abstract Map<Class<? extends android.app.Fragment>, AndroidInjector.Factory<? extends android.app.Fragment>> bindNativeFragments();
Run Code Online (Sandbox Code Playgroud)
我的猜测我需要将它放在BaseActivity中,因为它是一个抽象函数,但我如何在主活动中实现它?
我的主要活动:
public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> implements MainNavigator, HasSupportFragmentInjector {
@Inject
ViewModelProvider.Factory mViewModelFactory;
@Inject
DispatchingAndroidInjector<Fragment> fragmentDispatchingAndroidInjector;
private MainViewModel mMainViewModel;
private DrawerLayout mDrawer;
private Toolbar mToolbar;
private NavigationView mNavigationView;
// …Run Code Online (Sandbox Code Playgroud) 我在使用MVP时将Dagger 2与retrofit2库一起使用。一切顺利,直到我尝试集成另一个服务(基本上我试图将另一个改造对象初始化到另一个服务)。我遵循了这个答案,但是没有成功。
每次遇到错误时,我的每个片段和应用程序类似乎都无法识别组件类。
错误:找不到符号类DaggerApplicationComponent错误:找不到符号类DaggerEpisodeComponent
码
应用组件
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Retrofit exposeStreamingRetrofit();
Retrofit exposeRetrofit();
Context exposeContext();
AppPreferenceHelper exposePrefs();
}
Run Code Online (Sandbox Code Playgroud)
应用模块
@Module
public class ApplicationModule
{
private String mBaseUrl;
private Context mContext;
private AppPreferenceHelper mPrefsHelper;
public ApplicationModule(Context context,String baseUrl)
{
mContext = context;
mBaseUrl = baseUrl;
mPrefsHelper = new AppPreferenceHelper(context, Consts.PREF_NAME);
}
@Singleton
@Provides
GsonConverterFactory provideGsonConverterFactory()
{
GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create();
return gsonConverterFactory;
}
@Singleton
@Provides
@Named("ok-1")
OkHttpClient provideOkHttpClient()
{
HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用片段创建应用程序.我创建了一个测试片段(HomeFragment),它只有一个简单的TextView.我创建了所有必需的类(模块,模型和提供者).但我得到一个奇怪的并发症错误
Error:(25, 10) error: [dagger.android.AndroidInjector.inject(T)] android.arch.lifecycle.ViewModelProvider.Factory is bound multiple times:
@Provides android.arch.lifecycle.ViewModelProvider.Factory app.series.com.series3go.ui.main.MainActivityModule.mainViewModelProvider(app.series.com.series3go.ui.main.MainViewModel)
@Provides android.arch.lifecycle.ViewModelProvider.Factory app.series.com.series3go.ui.home.HomeFragmentModule.provideHomeFragmentViewModel(app.series.com.series3go.ui.home.HomeFragmentViewModel)
Run Code Online (Sandbox Code Playgroud)
HomeFragment
public class HomeFragment extends BaseFragment<HomeFragmentBinding, HomeFragmentViewModel> {
public static final String TAG = HomeFragment.class.getSimpleName();
@Inject
ViewModelProvider.Factory mViewModelFactory;
HomeFragmentBinding mHomeFragmentBinding;
private HomeFragmentViewModel mHomeFragmentViewModel;
public static HomeFragment newInstance() {
Bundle args = new Bundle();
HomeFragment fragment = new HomeFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mHomeFragmentBinding = …Run Code Online (Sandbox Code Playgroud)