课堂笔记
添加布局控件
- 在布局中添加 RecyclerView 用于显示搜索结果
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/search_results"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorViewPagerBg"
android:overScrollMode="never" />
设置 RecyclerView
@BindView(R.id.search_results)
public RecyclerView mRvSearchResults;
@Override
protected void initView() {
mRvSearchResults.setLayoutManager(new LinearLayoutManager(getContext()));
// 给 item 设置间距,大家可以用SizeUtil
mRvSearchResults.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
@NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.top = 8;
outRect.bottom = 8;
}
});
mSearchResultAdapter = new SearchResultAdapter();
mRvSearchResults.setAdapter(mSearchResultAdapter);
}
@Override
public void onSearchSuccess(SearchResult result, String keyword) {
// 改了下接口,把 keyword 传进来了
setUpState(State.SUCCESS);
mSearchRecommendContainer.setVisibility(View.GONE);
mSearchHistoriesContainer.setVisibility(View.GONE);
refreshContainer.setVisibility(View.VISIBLE);
try {
mHomePagerContentAdapter.setData(result.getData().getTbk_dg_material_optional_response()
.getResult_list().getMap_data());
} catch (Exception e) {
// 这是我自己写的,如果搜索结果为空的话,就搜索在空格后的 keyword
toSearch(" " + keyword);
}
}
- 其中 SearchResultAdapter 中的 item 布局为复用首页列表的 item,代码就不上了,已经被我删了,因为我们要删除SearchResultAdapter,复用首页列表适配器 HomePagerContentAdapter
重构首页适配器到搜索结果上
- 这里的关键是给适配器的数据类型要统一,我们可以定义接口,让不同页面的数据实现接口,再把接口作为数据传给适配器
- 首先根据需要的数据定义接口,继承 IBaseInfo 是因为它里面的数据我们都需要
public interface ILinerItemInfo extends IBaseInfo {
long getCouponAmount();
String getFinalPrice();
long getVolume();
}
- 让首页和搜索页面的结果数据实现 ILinerItemInfo,实现方法后,可能会出现一些参数类型不匹配的情况,这些是小问题,慢慢调试就行了
- 重点是(困了我很久):传入适配器里的数据是 List,里面的参数不能用 ILinerItemInfo 代替,而是要用继承自ILinerItemInfo 的泛型表示,当时写代码的时候没注意,导致我还要修改 fragment 里的参数,然后是接口里的参数,然后...
public void setData(List<? extends ILinerItemInfo> contents) {
mData.clear();
mData.addAll(contents);
notifyDataSetChanged();
}
- 这样就可以一步一步把数据都换成 ILinerItemInfo,最后通过 ILinerItemInfo 拿到 item 需要的数据
public void setData(ILinerItemInfo dataBean) {
Context context = itemView.getContext();
// 直接设置图片大小
int size = 100;
String coverUrl = UrlUtils.getCoverPath(dataBean.getPublicCover(), size);
Glide.with(context).load(coverUrl).into(cover);
//商品标题
title.setText(dataBean.getPublicTitle());
//优惠券金额
long couponAmount = dataBean.getCouponAmount();
offPrice.setText(String.format(context.getString(R.string.text_goods_off_price), couponAmount));
//商品原价
String zkFinalPrice = dataBean.getFinalPrice();
originalPrice.setText(String.format(context.getString(R.string.text_goods_original_price), zkFinalPrice));
//设置中划线
originalPrice.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);
//商品券后价(原价-优惠券金额)
float zkAfterOffPrice = Float.valueOf(zkFinalPrice) - couponAmount;
//券后价金额保留两位小数
afterOffPrice.setText(String.format("%.2f", zkAfterOffPrice));
//商品销量
sellCount.setText(String.format(context.getString(R.string.text_goods_sell_count), dataBean.getVolume()));
}
视频链接