1.關(guān)于DataBinding
1.1 RecyclerView中使用DataBinding
public class FavorAdapter extends RecyclerView.Adapter<FavorAdapter.ViewHolder> {
...
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.home_list_item_cover, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final MyFavor myFavor = mMyFavors.get(position);
holder.bind(myFavor);
...
}
class ViewHolder extends RecyclerView.ViewHolder {
HomeListItemCoverBinding mBinding;
public ViewHolder(View itemView) {
super(itemView);
mBinding = DataBindingUtil.bind(itemView);
}
public void bind(@NonNull MyFavor favor) {
mBinding.setFavor(favor);
}
}
}
其中要注意的一點是HomeListItemCoverBinding mBinding;
的位置,最開始的時候圖方便籽前,把它直接放到Adapter里面亭珍,然后在onBindViewHolder(final ViewHolder holder, int position)
里直接使用了,這樣是不行的枝哄。因為每一個Binding對應(yīng)了一個Item(ViewHolder)块蚌,所以不能把它放到Adapter下面,這樣的話刷新界面或者移動列表會出現(xiàn)數(shù)據(jù)錯誤膘格。另外想要在onBindViewHolder(final ViewHolder holder, int position)
方法里獲取binding的話就用holder.mBinding來操作峭范。
1.2 關(guān)于綁定String類型數(shù)據(jù)
比如一個登陸頁面
<layout>
<data>
<variable name="username" type="String"/>
<variable name="password" type="String"/>
</data>
...
...
...
</layout>
這里的
<variable name="username" type="String"/>
<variable name="password" type="String"/>
如果1.綁定對象是EditText 2.雙向綁定,那么不能使用String類型瘪贱。由于String是其實是一個不變類纱控,一旦在輸入框中改變的文字,那么Java代碼中綁定的String就已經(jīng)不是輸入框里的那個String了菜秦。要為View指定一個ViewModel
public class LoginViewModel {
private String mUsername;
private String mPassword;
public LoginViewModel(String username, String password) {
mUsername = username;
mPassword = password;
}
getters...
setters...
然后把要綁定的屬性放進去甜害。
<variable
name="loginViewModel"
type="com.yohom.show.launcher.view.viewmodel.LoginViewModel"/>
2.關(guān)于Retrofit請求
presenter層
public class PopularPresenter extends BasePresenter<HomeRepo, PopularContract.View> implements PopularContract.Presenter {
@Inject
protected PopularPresenter(HomeRepo homeRepo, BaseScheduler scheduler) {
super(homeRepo, scheduler);
}
@Override
public void getPopularList(String page) {
Subscription subscription = mRepo
.getPopular(page)
.subscribeOn(mScheduler.io())
.observeOn(mScheduler.ui())
.subscribe(new MyObserver<Bean<Popular>>(){
@Override
public void onNext(Bean<Popular> bean) {
mView.processPopular(bean);
}
});
mSubscriptions.add(subscription);
}
}
model層
public class HomeRepo {
private HomeService mService;
public HomeRepo() {
mService = getRetrofit().create(HomeService.class);
}
public Observable<Bean<List<MyFavor>>> getFavouriteList() {
MyParams params = new MyParams();
return mService.getFavouriteList(params.get());
}
interface HomeService {
@FormUrlEncoded
@POST(NEW_ATTENTION)
Observable<Bean<List<MyFavor>>> getFavouriteList(@FieldMap Map<String, String> map);
}
}
剛開始只寫了presenter的時候,想先測試一下能不能正確返回數(shù)據(jù)并解析成對應(yīng)的實體類球昨,后來發(fā)現(xiàn)retrofit請求怎么也發(fā)不出去尔店,但是其他presenter的請求卻能發(fā)出去,一開始還以為有可能是連續(xù)兩個請求間隔太短了主慰,debug了半天嚣州,后來發(fā)現(xiàn)是因為
@Override
public void getPopularList(String page) {
Subscription subscription = mRepo
.getPopular(page)
.subscribeOn(mScheduler.io())
.observeOn(mScheduler.ui())
.subscribe(new MyObserver<Bean<Popular>>(){
@Override
public void onNext(Bean<Popular> bean) {
mView.processPopular(bean);
}
});
mSubscriptions.add(subscription);
}
寫成了
@Override
public void getPopularList(String page) {
mRepo.getPopular(page);
}
我以為只要調(diào)用了HomeService的getPopular方法就會發(fā)起請求,原來是一定要訂閱了才會發(fā)起請求(至少只有訂閱了才會打印日志)共螺,謹記謹記该肴。
3.在xml文件中指定RecyclerView的LayoutManager
<RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="GridLayoutManager"
app:spanCount="2"/>
重點是
app:layoutManager="GridLayoutManager"
app:spanCount="2"
這兩句,其他的屬性以此類推藐不。
4.圖片加邊框
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:width="3dp" android:color="@color/gray" />
<padding android:left="1dp" android:top="1dp"
android:right="1dp" android:bottom="1dp" />
</shape>
重點是這個padding屬性匀哄,不加的話邊框是看不出的秦效。