11111
@@ -58,7 +58,8 @@
|
||||
android:screenOrientation="portrait" />
|
||||
<activity
|
||||
android:name=".activity.SearchActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@style/CAppTheme"/>
|
||||
<activity
|
||||
android:name=".activity.FollowActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
@@ -2,101 +2,30 @@ package com.yunbao.main.activity;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Color;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.animation.AccelerateInterpolator;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.yunbao.common.Constants;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import com.yunbao.common.activity.AbsActivity;
|
||||
import com.yunbao.common.adapter.RefreshAdapter;
|
||||
import com.yunbao.common.custom.CommonRefreshView;
|
||||
import com.yunbao.common.event.FollowEvent;
|
||||
import com.yunbao.common.http.HttpCallback;
|
||||
import com.yunbao.common.interfaces.OnItemClickListener;
|
||||
import com.yunbao.common.utils.RouteUtil;
|
||||
import com.yunbao.common.utils.ToastUtil;
|
||||
import com.yunbao.common.utils.WordUtil;
|
||||
import com.yunbao.live.bean.SearchUserBean;
|
||||
import com.yunbao.main.R;
|
||||
import com.yunbao.main.adapter.CommonAdapter;
|
||||
import com.yunbao.main.adapter.MultiItemTypeAdapter;
|
||||
import com.yunbao.main.adapter.SearchAdapter;
|
||||
import com.yunbao.main.adapter.ViewHolder;
|
||||
import com.yunbao.main.dialog.BlankDialog;
|
||||
import com.yunbao.main.fragment.SearchRecommendFragment;
|
||||
import com.yunbao.main.fragment.SearchResultsFragment;
|
||||
import com.yunbao.main.fragment.SearchResultsItemFragment;
|
||||
import com.yunbao.main.http.MainHttpConsts;
|
||||
import com.yunbao.main.http.MainHttpUtil;
|
||||
import com.yunbao.main.utils.HXLinePagerIndicator;
|
||||
|
||||
import net.lucode.hackware.magicindicator.MagicIndicator;
|
||||
import net.lucode.hackware.magicindicator.ViewPagerHelper;
|
||||
import net.lucode.hackware.magicindicator.buildins.UIUtil;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.SimplePagerTitleView;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
//import com.google.gson.jpush.reflect.TypeToken;
|
||||
|
||||
/**
|
||||
* Created by cxf on 2018/10/25.
|
||||
*/
|
||||
|
||||
public class SearchActivity extends AbsActivity implements OnItemClickListener<SearchUserBean> {
|
||||
|
||||
private ViewPager vp_content;
|
||||
private MagicIndicator magicIndicator;
|
||||
private LinearLayout search_view, lt_search_list;
|
||||
private ImageView search_del;
|
||||
public class SearchActivity extends AbsActivity {
|
||||
private EditText mEditText;
|
||||
private CommonRefreshView mRefreshView;
|
||||
private SearchAdapter mSearchAdapter;
|
||||
private InputMethodManager imm;
|
||||
private String mKey;
|
||||
private MyHandler mHandler;
|
||||
private RecyclerView list_record;
|
||||
private CommonAdapter adapter;
|
||||
private List<String> records;
|
||||
|
||||
SharedPreferences sharedPreferences;
|
||||
SharedPreferences.Editor editor;
|
||||
|
||||
private Fragment[] fragments = null;
|
||||
private final String[] titles = {WordUtil.getString(R.string.all), WordUtil.getString(R.string.live_anchor), WordUtil.getString(R.string.user)};
|
||||
|
||||
public static void forward(Context context) {
|
||||
context.startActivity(new Intent(context, SearchActivity.class));
|
||||
@@ -107,288 +36,61 @@ public class SearchActivity extends AbsActivity implements OnItemClickListener<S
|
||||
return R.layout.activity_search;
|
||||
}
|
||||
|
||||
Gson gson;
|
||||
|
||||
//历史记录
|
||||
@Override
|
||||
protected void main() {
|
||||
imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
search_view = (LinearLayout) findViewById(R.id.search_view);
|
||||
search_del = (ImageView) findViewById(R.id.search_del);
|
||||
mEditText = (EditText) findViewById(R.id.edit);
|
||||
list_record = (RecyclerView) findViewById(R.id.list_record);
|
||||
lt_search_list = (LinearLayout) findViewById(R.id.lt_search_list);
|
||||
magicIndicator = (MagicIndicator) findViewById(R.id.magic_indicator);
|
||||
vp_content = (ViewPager) findViewById(R.id.vp_content);
|
||||
|
||||
searchIndicator();//绑定指示器
|
||||
|
||||
sharedPreferences = getSharedPreferences("data", Context.MODE_PRIVATE);
|
||||
editor = sharedPreferences.edit();
|
||||
|
||||
gson = new Gson();
|
||||
records = new ArrayList<>();
|
||||
if (sharedPreferences.contains("data")) {
|
||||
records = gson.fromJson(sharedPreferences.getString("data", ""), new TypeToken<List<String>>() {
|
||||
}.getType());
|
||||
Collections.reverse(records);
|
||||
}
|
||||
search_view.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
records.clear();
|
||||
editor.clear();
|
||||
editor.commit();
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
});
|
||||
adapter = new CommonAdapter(SearchActivity.this, R.layout.item_search_record, records) {
|
||||
@Override
|
||||
protected void convert(ViewHolder holder, Object o, final int position) {
|
||||
holder.setText(R.id.text_id, records.get(position));
|
||||
}
|
||||
|
||||
};
|
||||
adapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
|
||||
mEditText.setText(records.get(position));
|
||||
search();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
list_record.setLayoutManager(new GridLayoutManager(this, 4));
|
||||
list_record.setAdapter(adapter);
|
||||
mEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
|
||||
@Override
|
||||
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
|
||||
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
|
||||
search();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
mEditText.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||
MainHttpUtil.cancel(MainHttpConsts.SEARCH);
|
||||
if (mHandler != null) {
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
if (!TextUtils.isEmpty(s)) {
|
||||
if (mHandler != null) {
|
||||
mHandler.sendEmptyMessageDelayed(0, 500);
|
||||
}
|
||||
} else {
|
||||
mKey = null;
|
||||
if (mSearchAdapter != null) {
|
||||
mSearchAdapter.clearData();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
}
|
||||
});
|
||||
mRefreshView = findViewById(R.id.refreshView);
|
||||
mRefreshView.setEmptyLayoutId(R.layout.view_no_data_search);
|
||||
mRefreshView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false));
|
||||
mRefreshView.setDataHelper(new CommonRefreshView.DataHelper<SearchUserBean>() {
|
||||
@Override
|
||||
public RefreshAdapter<SearchUserBean> getAdapter() {
|
||||
if (mSearchAdapter == null) {
|
||||
mSearchAdapter = new SearchAdapter(mContext, Constants.FOLLOW_FROM_SEARCH);
|
||||
mSearchAdapter.setOnItemClickListener(SearchActivity.this);
|
||||
}
|
||||
return mSearchAdapter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadData(int p, HttpCallback callback) {
|
||||
if (!TextUtils.isEmpty(mKey)) {
|
||||
search_view.setVisibility(View.GONE);
|
||||
if (!sharedPreferences.getString("data", "").contains(mKey)) {
|
||||
if (records.size() > 10) {
|
||||
records.remove(0);
|
||||
}
|
||||
records.add(mKey);
|
||||
editor.putString("data", gson.toJson(records));
|
||||
editor.commit();
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
MainHttpUtil.search(mKey, typeIndex, p, callback);
|
||||
lt_search_list.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
search_view.setVisibility(View.VISIBLE);
|
||||
lt_search_list.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SearchUserBean> processData(String[] info) {
|
||||
return JSON.parseArray(Arrays.toString(info), SearchUserBean.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRefreshSuccess(List<SearchUserBean> list, int listCount) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRefreshFailure() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadMoreSuccess(List<SearchUserBean> loadItemList, int loadItemCount) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadMoreFailure() {
|
||||
|
||||
}
|
||||
});
|
||||
mHandler = new MyHandler(this);
|
||||
EventBus.getDefault().register(this);
|
||||
//進入頁面首先展示推薦頁面
|
||||
SearchRecommendFragment searchRecommendFragment = new SearchRecommendFragment();
|
||||
FragmentManager manager = getSupportFragmentManager();
|
||||
FragmentTransaction transaction = manager.beginTransaction();
|
||||
transaction.replace(R.id.context_layout, searchRecommendFragment);
|
||||
transaction.commit();
|
||||
mEditText = findViewById(R.id.edit);
|
||||
mEditText.addTextChangedListener(textWatcher);
|
||||
}
|
||||
|
||||
//绑定指示器
|
||||
private int typeIndex = 1;
|
||||
private void searchIndicator() {
|
||||
CommonNavigator commonNavigator = new CommonNavigator(this);
|
||||
commonNavigator.setAdjustMode(true);
|
||||
commonNavigator.setAdapter(new CommonNavigatorAdapter() {
|
||||
@Override
|
||||
public int getCount() {
|
||||
return titles == null ? 0 : titles.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPagerTitleView getTitleView(Context context, final int index) {
|
||||
SimplePagerTitleView simplePagerTitleView = new SimplePagerTitleView(context);
|
||||
simplePagerTitleView.setText(titles[index]);
|
||||
simplePagerTitleView.setTextSize(16);//设置导航的文字大小
|
||||
simplePagerTitleView.setNormalColor(Color.BLACK);//正常状态下的标题颜色
|
||||
simplePagerTitleView.setSelectedColor(getResources().getColor(R.color.global));//选中的标题字体颜色
|
||||
simplePagerTitleView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
vp_content.setCurrentItem(index);
|
||||
typeIndex = 1 + index;
|
||||
search();
|
||||
}
|
||||
});
|
||||
return simplePagerTitleView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPagerIndicator getIndicator(Context context) {
|
||||
HXLinePagerIndicator indicator = new HXLinePagerIndicator(context);
|
||||
indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
|
||||
indicator.setLineHeight(UIUtil.dip2px(context, 4));
|
||||
indicator.setLineWidth(UIUtil.dip2px(context, 20));
|
||||
indicator.setRoundRadius(UIUtil.dip2px(context, 3));
|
||||
indicator.setStartInterpolator(new AccelerateInterpolator());
|
||||
indicator.setEndInterpolator(new DecelerateInterpolator(2.0f));
|
||||
indicator.setColors(getResources().getColor(R.color.global));
|
||||
return indicator;
|
||||
}
|
||||
});
|
||||
magicIndicator.setNavigator(commonNavigator);
|
||||
fragments = new Fragment[]{new BlankDialog(),new BlankDialog(),new BlankDialog()};
|
||||
//每项只进入一次
|
||||
vp_content.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
return fragments[position];
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return fragments.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
return titles[position];
|
||||
}
|
||||
});
|
||||
ViewPagerHelper.bind(magicIndicator, vp_content);
|
||||
}
|
||||
|
||||
private void search() {
|
||||
String key = mEditText.getText().toString().trim();
|
||||
if (TextUtils.isEmpty(key)) {
|
||||
ToastUtil.show(R.string.content_empty);
|
||||
return;
|
||||
}
|
||||
MainHttpUtil.cancel(MainHttpConsts.SEARCH);
|
||||
if (mHandler != null) {
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
mKey = key;
|
||||
mRefreshView.initData();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
EventBus.getDefault().unregister(this);
|
||||
MainHttpUtil.cancel(MainHttpConsts.SEARCH);
|
||||
if (mHandler != null) {
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
mHandler.release();
|
||||
}
|
||||
mHandler = null;
|
||||
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
//輸入框監聽函數
|
||||
TextWatcher textWatcher = new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onFollowEvent(FollowEvent e) {
|
||||
if (mSearchAdapter != null) {
|
||||
mSearchAdapter.updateItem(e.getToUid(), e.getIsAttention());
|
||||
ToastUtil.show(getResources().getString(R.string.following));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClick(SearchUserBean bean, int position) {
|
||||
//跳转到个人资料
|
||||
if (imm != null && mEditText != null) {
|
||||
imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
|
||||
RouteUtil.forwardUserHome(mContext, bean.getId(),0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static class MyHandler extends Handler {
|
||||
|
||||
private SearchActivity mActivity;
|
||||
|
||||
public MyHandler(SearchActivity activity) {
|
||||
mActivity = new WeakReference<>(activity).get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
if (mActivity != null) {
|
||||
mActivity.search();
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||
if (TextUtils.isEmpty(s.toString())) {
|
||||
//檢索推薦頁面
|
||||
SearchRecommendFragment searchRecommendFragment = new SearchRecommendFragment();
|
||||
FragmentManager manager = getSupportFragmentManager();
|
||||
FragmentTransaction transaction = manager.beginTransaction();
|
||||
transaction.replace(R.id.context_layout, searchRecommendFragment);
|
||||
transaction.commit();
|
||||
} else {
|
||||
//展示檢索頁面
|
||||
SearchResultsFragment searchResultsFragment = new SearchResultsFragment();
|
||||
FragmentManager manager = getSupportFragmentManager();
|
||||
FragmentTransaction transaction = manager.beginTransaction();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString("searchKey", s.toString());
|
||||
searchResultsFragment.setArguments(bundle);
|
||||
transaction.replace(R.id.context_layout, searchResultsFragment);
|
||||
transaction.commit();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void release() {
|
||||
mActivity = null;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.yunbao.main.adapter;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
|
||||
import com.yunbao.main.R;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SearchFragmentPagerAdapter extends FragmentPagerAdapter {
|
||||
private Context mContext;
|
||||
|
||||
private List<Fragment> fragmentList;
|
||||
private List<String> tabs = new ArrayList<>();
|
||||
|
||||
|
||||
public SearchFragmentPagerAdapter(FragmentManager fm, Context mContext, List<Fragment> fragmentList) {
|
||||
super(fm);
|
||||
this.mContext = mContext;
|
||||
this.fragmentList = fragmentList;
|
||||
tabs.add(mContext.getResources().getString(R.string.all));
|
||||
tabs.add(mContext.getResources().getString(R.string.anchor));
|
||||
tabs.add(mContext.getResources().getString(R.string.user));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fragment getItem(int i) {
|
||||
return fragmentList.get(i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return fragmentList.size();
|
||||
}
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
return tabs.get(position);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.yunbao.main.adapter;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.yunbao.common.bean.SearchRecommendModel;
|
||||
import com.yunbao.main.R;
|
||||
import com.yunbao.main.views.SearchRecommendBodyViewHolder;
|
||||
import com.yunbao.main.views.SearchRecommendHeardViewHolder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 搜索推薦頁面適配器
|
||||
*/
|
||||
public class SearchRecommendAdapter extends RecyclerView.Adapter {
|
||||
private static final int HEAD = 0;
|
||||
private static final int BODY = 1;
|
||||
private List<SearchRecommendModel> recommendModels = new ArrayList<>();
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
switch (viewType) {
|
||||
case HEAD:
|
||||
View herdView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_search_recommend_heard, parent, false);
|
||||
return new SearchRecommendHeardViewHolder(herdView);
|
||||
default:
|
||||
View bodyView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_search_recommend_body, parent, false);
|
||||
return new SearchRecommendBodyViewHolder(bodyView);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||
if (holder instanceof SearchRecommendHeardViewHolder) {
|
||||
SearchRecommendHeardViewHolder heardViewHolder = (SearchRecommendHeardViewHolder) holder;
|
||||
heardViewHolder.setHistory(recommendModels.get(position).getHistoryRecordMap());
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return recommendModels.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (position == (recommendModels.size() - 1)) {
|
||||
return HEAD;
|
||||
} else {
|
||||
return BODY;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
*
|
||||
* @param list
|
||||
*/
|
||||
public void addData(List<SearchRecommendModel> list) {
|
||||
recommendModels.clear();
|
||||
recommendModels.addAll(list);
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.yunbao.main.adapter;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.yunbao.common.bean.SearchModel;
|
||||
import com.yunbao.main.R;
|
||||
import com.yunbao.main.views.SearchResultsViewHolder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SearchResultsAdapter extends RecyclerView.Adapter {
|
||||
private List<SearchModel> searchModels = new ArrayList<>();
|
||||
private int type = -1;
|
||||
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
View bodyView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_search_results_item_holder, parent, false);
|
||||
return new SearchResultsViewHolder(bodyView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||
if (holder instanceof SearchResultsViewHolder) {
|
||||
SearchResultsViewHolder resultsViewHolder = (SearchResultsViewHolder) holder;
|
||||
resultsViewHolder.showData(searchModels.get(position), type);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return searchModels.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加數據源
|
||||
*
|
||||
* @param models
|
||||
*/
|
||||
public void putData(List<SearchModel> models, int type) {
|
||||
this.type = type;
|
||||
searchModels.clear();
|
||||
searchModels.addAll(models);
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package com.yunbao.main.adapter;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.yunbao.common.bean.SearchModel;
|
||||
import com.yunbao.main.R;
|
||||
import com.yunbao.main.views.AnchorSearchResultsItemViewHolder;
|
||||
import com.yunbao.main.views.UserSearchResultsItemViewHolder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 搜索結果頁面適配器
|
||||
*/
|
||||
public class SearchResultsItemAdapter extends RecyclerView.Adapter {
|
||||
private List<List<SearchModel>> lists = new ArrayList<>();
|
||||
private final int ANCHOR = 2, USER = 3;
|
||||
private int type = -1;
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
switch (viewType) {
|
||||
case ANCHOR:
|
||||
View herdView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_anchor_search_results_item_holder, parent, false);
|
||||
return new AnchorSearchResultsItemViewHolder(herdView);
|
||||
default:
|
||||
View bodyView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_user_search_results_item_holder, parent, false);
|
||||
return new UserSearchResultsItemViewHolder(bodyView);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||
if (holder instanceof AnchorSearchResultsItemViewHolder) {
|
||||
AnchorSearchResultsItemViewHolder itemViewHolder = (AnchorSearchResultsItemViewHolder) holder;
|
||||
itemViewHolder.showAnchors(lists.get(position), ANCHOR);
|
||||
if (type != 1) {
|
||||
itemViewHolder.hideTypeTitle();
|
||||
}
|
||||
} else {
|
||||
UserSearchResultsItemViewHolder viewHolder = (UserSearchResultsItemViewHolder) holder;
|
||||
viewHolder.showAnchors(lists.get(position), USER);
|
||||
if (type != 1) {
|
||||
viewHolder.hideTypeTitle();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return lists.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (type == 1) {
|
||||
if (position == (lists.size() - 1)) {
|
||||
return ANCHOR;
|
||||
} else {
|
||||
return USER;
|
||||
}
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 設置數據源
|
||||
*
|
||||
* @param mLists 數據源
|
||||
* @param type
|
||||
*/
|
||||
public void showData(List<List<SearchModel>> mLists, int type) {
|
||||
this.type = type;
|
||||
lists.clear();
|
||||
lists.addAll(mLists);
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.yunbao.main.event;
|
||||
|
||||
import com.yunbao.common.bean.BaseModel;
|
||||
|
||||
public class AnchorSearchEvent extends BaseModel {
|
||||
private int jumpType = 0;
|
||||
|
||||
public int getJumpType() {
|
||||
return jumpType;
|
||||
}
|
||||
|
||||
public AnchorSearchEvent setJumpType(int jumpType) {
|
||||
this.jumpType = jumpType;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.yunbao.main.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.yunbao.common.bean.SearchRecommendModel;
|
||||
import com.yunbao.common.fragment.BaseFragment;
|
||||
import com.yunbao.main.R;
|
||||
import com.yunbao.main.adapter.SearchRecommendAdapter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 搜索推荐页面 搜索結果
|
||||
*/
|
||||
public class SearchRecommendFragment extends BaseFragment {
|
||||
private RecyclerView searchRecommend;
|
||||
private SearchRecommendAdapter adapter;
|
||||
|
||||
|
||||
@Override
|
||||
public View createView(LayoutInflater layoutInflater, ViewGroup viewGroup) {
|
||||
return layoutInflater.inflate(R.layout.view_search_recommend, viewGroup, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initVariables(Bundle bundle) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initViews(Bundle savedInstanceState, View contentView) {
|
||||
searchRecommend = contentView.findViewById(R.id.search_recommend_list);
|
||||
|
||||
adapter = new SearchRecommendAdapter();
|
||||
searchRecommend.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, true));
|
||||
searchRecommend.setAdapter(adapter);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadData() {
|
||||
List<SearchRecommendModel> searchRecommendModels = new ArrayList<>();
|
||||
SearchRecommendModel model = new SearchRecommendModel();
|
||||
Map<String, String> historyRecordMap = new HashMap<>();
|
||||
historyRecordMap.put("大米", "");
|
||||
historyRecordMap.put("開門", "");
|
||||
historyRecordMap.put("芝麻", "");
|
||||
historyRecordMap.put("瓦達上來看沒看", "");
|
||||
historyRecordMap.put("錒", "");
|
||||
historyRecordMap.put("加兩顆蛋", "");
|
||||
historyRecordMap.put("打算", "");
|
||||
searchRecommendModels.add(model.setHistoryRecordMap(historyRecordMap));
|
||||
adapter.addData(searchRecommendModels);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.yunbao.main.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import com.yunbao.common.fragment.BaseFragment;
|
||||
import com.yunbao.main.R;
|
||||
import com.yunbao.main.adapter.SearchFragmentPagerAdapter;
|
||||
import com.yunbao.main.event.AnchorSearchEvent;
|
||||
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* 搜索結果展示頁面
|
||||
*/
|
||||
public class SearchResultsFragment extends BaseFragment {
|
||||
private String searchKey = "1";//
|
||||
private TabLayout searchType;
|
||||
private ViewPager fragmentViewpager;
|
||||
private ArrayList<Fragment> ViewList = new ArrayList<>(); //页卡视图集合
|
||||
private SearchFragmentPagerAdapter fragmentPagerAdapter;
|
||||
|
||||
@Override
|
||||
|
||||
public View createView(LayoutInflater layoutInflater, ViewGroup viewGroup) {
|
||||
return layoutInflater.inflate(R.layout.view_search_results, viewGroup, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initVariables(Bundle bundle) {
|
||||
searchKey = bundle.getString("searchKey");
|
||||
ViewList.add(SearchResultsItemFragment.newInstance(searchKey, SearchResultsItemFragment.SearchResultsType.ALL.getType()));
|
||||
ViewList.add(SearchResultsItemFragment.newInstance(searchKey, SearchResultsItemFragment.SearchResultsType.ANCHOR.getType()));
|
||||
ViewList.add(SearchResultsItemFragment.newInstance(searchKey, SearchResultsItemFragment.SearchResultsType.USER.getType()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initViews(Bundle savedInstanceState, View contentView) {
|
||||
|
||||
searchType = contentView.findViewById(R.id.search_type);
|
||||
fragmentViewpager = contentView.findViewById(R.id.context_layout);
|
||||
|
||||
fragmentPagerAdapter = new SearchFragmentPagerAdapter(getChildFragmentManager(), getActivity(), ViewList);
|
||||
fragmentViewpager.setAdapter(fragmentPagerAdapter);
|
||||
searchType.setupWithViewPager(fragmentViewpager);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadData() {
|
||||
}
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onAnchorSearchEvent(AnchorSearchEvent event) {
|
||||
fragmentViewpager.setCurrentItem(event.getJumpType());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
package com.yunbao.main.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.yunbao.common.bean.SearchModel;
|
||||
import com.yunbao.common.fragment.BaseFragment;
|
||||
import com.yunbao.common.http.base.HttpCallback;
|
||||
import com.yunbao.common.http.main.MainNetManager;
|
||||
import com.yunbao.common.utils.ToastUtil;
|
||||
import com.yunbao.main.R;
|
||||
import com.yunbao.main.adapter.SearchResultsItemAdapter;
|
||||
import com.yunbao.main.utils.WordsTypeUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 展示結果的分類頁面
|
||||
*/
|
||||
public class SearchResultsItemFragment extends BaseFragment {
|
||||
private String searchKey = "";
|
||||
private int page = 1;
|
||||
private LinearLayout loading;
|
||||
private RecyclerView searchList;
|
||||
private SearchResultsItemAdapter itemAdapter;
|
||||
|
||||
@Override
|
||||
public View createView(LayoutInflater layoutInflater, ViewGroup viewGroup) {
|
||||
return layoutInflater.inflate(R.layout.view_search_results_item, viewGroup, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initVariables(Bundle bundle) {
|
||||
setSearchKey(bundle.getString("searchKey"), bundle.getInt("type"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initViews(Bundle savedInstanceState, View contentView) {
|
||||
loading = contentView.findViewById(R.id.loading);
|
||||
searchList = contentView.findViewById(R.id.search_list);
|
||||
loading.setVisibility(View.VISIBLE);
|
||||
itemAdapter = new SearchResultsItemAdapter();
|
||||
searchList.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, true));
|
||||
searchList.setAdapter(itemAdapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadData() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 開始檢索關鍵字
|
||||
*
|
||||
* @param searchKey 關鍵字
|
||||
* @param type 類型
|
||||
*/
|
||||
public void setSearchKey(String searchKey, int type) {
|
||||
this.searchKey = searchKey;
|
||||
if (type == 1) {
|
||||
MainNetManager.get(getActivity())
|
||||
.search(WordsTypeUtil.changeSimplified(searchKey),
|
||||
WordsTypeUtil.changeTraditional(searchKey),
|
||||
type, page, new HttpCallback<List<List<SearchModel>>>() {
|
||||
@Override
|
||||
public void onSuccess(List<List<SearchModel>> data) {
|
||||
Collections.reverse(data);
|
||||
itemAdapter.showData(data, type);
|
||||
loading.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(String error) {
|
||||
loading.setVisibility(View.GONE);
|
||||
ToastUtil.show(error);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
MainNetManager.get(getActivity())
|
||||
.searchNew(WordsTypeUtil.changeSimplified(searchKey),
|
||||
WordsTypeUtil.changeTraditional(searchKey),
|
||||
type, page, new HttpCallback<List<SearchModel>>() {
|
||||
@Override
|
||||
public void onSuccess(List<SearchModel> data) {
|
||||
List<List<SearchModel>> listList = new ArrayList<>();
|
||||
listList.add(data);
|
||||
itemAdapter.showData(listList, type);
|
||||
loading.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(String error) {
|
||||
loading.setVisibility(View.GONE);
|
||||
ToastUtil.show(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public enum SearchResultsType {
|
||||
ALL(1, "全部"),
|
||||
ANCHOR(2, "主播"),
|
||||
USER(3, "用戶");
|
||||
|
||||
private int type;
|
||||
private String name;
|
||||
|
||||
SearchResultsType(int type, String name) {
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public SearchResultsType setType(int type) {
|
||||
this.type = type;
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public SearchResultsType setName(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
public static SearchResultsItemFragment newInstance(String searchKey,int type){
|
||||
SearchResultsItemFragment searchRecommendFragment = new SearchResultsItemFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString("searchKey", searchKey);
|
||||
bundle.putInt("type", type);
|
||||
searchRecommendFragment.setArguments(bundle);
|
||||
return searchRecommendFragment;
|
||||
}
|
||||
}
|
||||
@@ -318,6 +318,17 @@ public class MainHttpUtil {
|
||||
.params("p", p)
|
||||
.execute(callback);
|
||||
}
|
||||
/**
|
||||
* 搜索
|
||||
*/
|
||||
public static void searchnew(String fan_key, String jian_key,int type, int p, HttpCallback callback) {
|
||||
HttpClient.getInstance().get("", MainHttpConsts.SEARCH)
|
||||
.params("jian_key", jian_key)
|
||||
.params("fan_key", fan_key)
|
||||
.params("type", type)
|
||||
.params("p", p)
|
||||
.execute(callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取我的拉黑列表
|
||||
|
||||
36
main/src/main/java/com/yunbao/main/utils/WordsTypeUtil.java
Normal file
@@ -0,0 +1,36 @@
|
||||
package com.yunbao.main.utils;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import taobe.tec.jcc.JChineseConvertor;
|
||||
|
||||
/**
|
||||
* 繁體簡體轉換類
|
||||
*/
|
||||
public class WordsTypeUtil {
|
||||
//繁体转成简体
|
||||
public static String changeSimplified(String changeText) {
|
||||
try {
|
||||
JChineseConvertor jChineseConvertor = JChineseConvertor
|
||||
.getInstance();
|
||||
changeText = jChineseConvertor.t2s(changeText);
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return changeText;
|
||||
}
|
||||
|
||||
//简体转繁体
|
||||
public static String changeTraditional(String changeText) {
|
||||
try {
|
||||
JChineseConvertor jChineseConvertor = JChineseConvertor
|
||||
.getInstance();
|
||||
changeText = jChineseConvertor.s2t(changeText);
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return changeText;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.yunbao.main.views;
|
||||
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.yunbao.common.bean.SearchModel;
|
||||
import com.yunbao.common.utils.Bus;
|
||||
import com.yunbao.main.R;
|
||||
import com.yunbao.main.adapter.SearchResultsAdapter;
|
||||
import com.yunbao.main.event.AnchorSearchEvent;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 主播列表頁面
|
||||
*/
|
||||
public class AnchorSearchResultsItemViewHolder extends RecyclerView.ViewHolder {
|
||||
private RecyclerView anchorList;
|
||||
private TextView anchorMore;
|
||||
private SearchResultsAdapter resultsAdapter;
|
||||
private FrameLayout typeTitle;
|
||||
|
||||
public AnchorSearchResultsItemViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
anchorList = itemView.findViewById(R.id.anchor_list);
|
||||
anchorMore = itemView.findViewById(R.id.anchor_more);
|
||||
typeTitle = itemView.findViewById(R.id.type_title);
|
||||
anchorMore.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Bus.get().post(new AnchorSearchEvent().setJumpType(1));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void showAnchors(List<SearchModel> searchModels, int type) {
|
||||
resultsAdapter = new SearchResultsAdapter();
|
||||
anchorList.setLayoutManager(new LinearLayoutManager(itemView.getContext(), LinearLayoutManager.VERTICAL, true));
|
||||
anchorList.setAdapter(resultsAdapter);
|
||||
resultsAdapter.putData(searchModels, type);
|
||||
}
|
||||
|
||||
public void hideTypeTitle(){
|
||||
typeTitle.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.yunbao.main.views;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Path;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.ImageView;
|
||||
|
||||
/**
|
||||
* 圓形圖片
|
||||
*/
|
||||
public class ClipPathCircleImage extends ImageView {
|
||||
private int width;
|
||||
private int height;
|
||||
private Path path;
|
||||
|
||||
public ClipPathCircleImage(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
path = new Path();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
canvas.save();
|
||||
path.reset();
|
||||
path.addCircle(width / 2, height / 2, width / 2, Path.Direction.CCW);//CCW:逆时针,这里是一个简单的园,无影响
|
||||
canvas.clipPath(path);
|
||||
super.onDraw(canvas);
|
||||
canvas.restore();
|
||||
//使用Path时,如果不与Paint进行共同操作,无法解决抗锯齿问题。
|
||||
//这时候只能使用Paint的PorterDuff.Mode替代Path实现所需要的效果
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
width = w;
|
||||
height = h;
|
||||
}
|
||||
|
||||
public ClipPathCircleImage(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
this(context, attrs, defStyleAttr, 0);
|
||||
}
|
||||
|
||||
public ClipPathCircleImage(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public ClipPathCircleImage(Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
}
|
||||
128
main/src/main/java/com/yunbao/main/views/FlowLayout.java
Normal file
@@ -0,0 +1,128 @@
|
||||
package com.yunbao.main.views;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 流式佈局
|
||||
*/
|
||||
public class FlowLayout extends ViewGroup {
|
||||
|
||||
public FlowLayout(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public FlowLayout(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public FlowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
//遍历去调用所有子元素的measure方法(child.getMeasuredHeight()才能获取到值,否则为0)
|
||||
measureChildren(widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
int measuredWidth = 0, measuredHeight = 0;
|
||||
|
||||
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
|
||||
int widtMode = MeasureSpec.getMode(widthMeasureSpec);
|
||||
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
|
||||
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
|
||||
//由于计算子view所占宽度,这里传值需要自身减去PaddingRight宽度,PaddingLeft会在接下来计算子元素位置时加上
|
||||
Map<String, Integer> compute = compute(widthSize - getPaddingRight());
|
||||
|
||||
//EXACTLY模式:对应于给定大小或者match_parent情况
|
||||
if (widtMode == MeasureSpec.EXACTLY) {
|
||||
measuredWidth = widthSize;
|
||||
//AT_MOS模式:对应wrap-content(需要手动计算大小,否则相当于match_parent)
|
||||
} else if (widtMode == MeasureSpec.AT_MOST) {
|
||||
measuredWidth = compute.get("allChildWidth");
|
||||
}
|
||||
|
||||
if (heightMode == MeasureSpec.EXACTLY) {
|
||||
measuredHeight = heightSize;
|
||||
} else if (heightMode == MeasureSpec.AT_MOST) {
|
||||
measuredHeight = compute.get("allChildHeight");
|
||||
}
|
||||
//设置flow的宽高
|
||||
setMeasuredDimension(measuredWidth, measuredHeight);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||
for (int i = 0; i < getChildCount(); i++) {
|
||||
View child = getChildAt(i);
|
||||
Rect rect = (Rect) getChildAt(i).getTag();
|
||||
child.layout(rect.left, rect.top, rect.right, rect.bottom);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 测量过程
|
||||
*
|
||||
* @param flowWidth 该view的宽度
|
||||
* @return 返回子元素总所占宽度和高度(用于计算Flowlayout的AT_MOST模式设置宽高)
|
||||
*/
|
||||
private Map<String, Integer> compute(int flowWidth) {
|
||||
//是否是单行
|
||||
boolean aRow = true;
|
||||
MarginLayoutParams marginParams;//子元素margin
|
||||
int rowsWidth = getPaddingLeft();//当前行已占宽度(注意需要加上paddingLeft)
|
||||
int columnHeight = getPaddingTop();//当前行顶部已占高度(注意需要加上paddingTop)
|
||||
int rowsMaxHeight = 0;//当前行所有子元素的最大高度(用于换行累加高度)
|
||||
|
||||
for (int i = 0; i < getChildCount(); i++) {
|
||||
|
||||
View child = getChildAt(i);
|
||||
//获取元素测量宽度和高度
|
||||
int measuredWidth = child.getMeasuredWidth();
|
||||
int measuredHeight = child.getMeasuredHeight();
|
||||
//获取元素的margin
|
||||
marginParams = (MarginLayoutParams) child.getLayoutParams();
|
||||
//子元素所占宽度 = MarginLeft+ child.getMeasuredWidth+MarginRight 注意此时不能child.getWidth,因为界面没有绘制完成,此时wdith为0
|
||||
int childWidth = marginParams.leftMargin + marginParams.rightMargin + measuredWidth;
|
||||
int childHeight = marginParams.topMargin + marginParams.bottomMargin + measuredHeight;
|
||||
//判断是否换行: 该行已占大小+该元素大小>父容器宽度 则换行
|
||||
|
||||
rowsMaxHeight = Math.max(rowsMaxHeight, childHeight);
|
||||
//换行
|
||||
if (rowsWidth + childWidth > flowWidth) {
|
||||
//重置行宽度
|
||||
rowsWidth = getPaddingLeft() + getPaddingRight();
|
||||
//累加上该行子元素最大高度
|
||||
columnHeight += rowsMaxHeight;
|
||||
//重置该行最大高度
|
||||
rowsMaxHeight = childHeight;
|
||||
aRow = false;
|
||||
}
|
||||
//累加上该行子元素宽度
|
||||
rowsWidth += childWidth;
|
||||
//判断时占的宽段时加上margin计算,设置顶点位置时不包括margin位置,不然margin会不起作用,这是给View设置tag,在onlayout给子元素设置位置再遍历取出
|
||||
child.setTag(new Rect(rowsWidth - childWidth + marginParams.leftMargin, columnHeight + marginParams.topMargin, rowsWidth - marginParams.rightMargin, columnHeight + childHeight - marginParams.bottomMargin));
|
||||
}
|
||||
|
||||
//返回子元素总所占宽度和高度(用于计算Flowlayout的AT_MOST模式设置宽高)
|
||||
Map<String, Integer> flowMap = new HashMap<>();
|
||||
//单行
|
||||
if (aRow) {
|
||||
flowMap.put("allChildWidth", rowsWidth);
|
||||
} else {
|
||||
//多行
|
||||
flowMap.put("allChildWidth", flowWidth);
|
||||
}
|
||||
//FlowLayout测量高度 = 当前行顶部已占高度 +当前行内子元素最大高度+FlowLayout的PaddingBottom
|
||||
flowMap.put("allChildHeight", columnHeight + rowsMaxHeight + getPaddingBottom());
|
||||
return flowMap;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.yunbao.main.views;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
/**
|
||||
* 搜索推荐页头部搜索历史信息
|
||||
*/
|
||||
public class SearchRecommendBodyViewHolder extends RecyclerView.ViewHolder {
|
||||
public SearchRecommendBodyViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.yunbao.main.views;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.util.TypedValue;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.yunbao.main.R;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 搜索推荐页头部搜索历史信息
|
||||
*/
|
||||
public class SearchRecommendHeardViewHolder extends RecyclerView.ViewHolder {
|
||||
private ImageView searchDel;
|
||||
private FlowLayout searchHistory;
|
||||
|
||||
public SearchRecommendHeardViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
searchDel = itemView.findViewById(R.id.search_del);
|
||||
searchHistory = itemView.findViewById(R.id.search_history);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 展示搜索歷史
|
||||
*/
|
||||
public void setHistory(Map<String, String> historyMap) {
|
||||
LinearLayout.LayoutParams layoutParams =
|
||||
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
layoutParams.setMargins(17, 10, 0, 10);
|
||||
int i = 0;
|
||||
for (String key : historyMap.keySet()) {
|
||||
i = i + 1;
|
||||
TextView chip = new TextView(itemView.getContext());
|
||||
chip.setText(key);
|
||||
chip.setMaxEms(10);
|
||||
chip.setTextColor(Color.parseColor("#FF999999"));
|
||||
chip.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
|
||||
chip.setSingleLine();
|
||||
chip.setBackgroundResource(R.drawable.background_search_chip);
|
||||
chip.setLayoutParams(layoutParams);
|
||||
searchHistory.addView(chip, layoutParams);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.yunbao.main.views;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.yunbao.common.CommonAppConfig;
|
||||
import com.yunbao.common.bean.LevelBean;
|
||||
import com.yunbao.common.bean.SearchModel;
|
||||
import com.yunbao.common.glide.ImgLoader;
|
||||
import com.yunbao.main.R;
|
||||
|
||||
public class SearchResultsViewHolder extends RecyclerView.ViewHolder {
|
||||
private ImageView avatar, isLive, sex, focusOn, contribute;
|
||||
private TextView nickName;
|
||||
|
||||
public SearchResultsViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
avatar = itemView.findViewById(R.id.avatar);
|
||||
isLive = itemView.findViewById(R.id.is_live);
|
||||
sex = itemView.findViewById(R.id.sex);
|
||||
focusOn = itemView.findViewById(R.id.focus_on);
|
||||
nickName = itemView.findViewById(R.id.nick_name);
|
||||
contribute = itemView.findViewById(R.id.contribute);
|
||||
}
|
||||
|
||||
public void showData(SearchModel model, int type) {
|
||||
ImgLoader.displayAvatar(itemView.getContext(), model.getAvatar(), avatar);
|
||||
//用戶直接隱藏
|
||||
if (type == 3) {
|
||||
LevelBean levelBean = CommonAppConfig.getInstance().getLevel(Integer.parseInt(model.getLevel()));
|
||||
if (levelBean != null) {
|
||||
ImgLoader.display(itemView.getContext(), levelBean.getThumb(), contribute);
|
||||
}
|
||||
isLive.setVisibility(View.GONE);
|
||||
} else {
|
||||
LevelBean anchorLevelBean = CommonAppConfig.getInstance().getAnchorLevel(Integer.parseInt(model.getLevelAnchor()));
|
||||
if (anchorLevelBean != null) {
|
||||
ImgLoader.display(isLive.getContext(), CommonAppConfig.getInstance().HOST + anchorLevelBean.getThumb(), contribute);
|
||||
}
|
||||
isLive.setVisibility(model.getIslive() == 0 ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
if (model.getSex() == 2) {
|
||||
ImgLoader.displayAvatar(itemView.getContext(), R.mipmap.icon_sex_female_1, sex);
|
||||
} else {
|
||||
ImgLoader.displayAvatar(itemView.getContext(), R.mipmap.icon_sex_male_1, sex);
|
||||
}
|
||||
nickName.setText(model.getUserNicename());
|
||||
focusOn.setVisibility(TextUtils.equals(model.getIsattention(), "1") ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.yunbao.main.views;
|
||||
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.yunbao.common.bean.SearchModel;
|
||||
import com.yunbao.common.utils.Bus;
|
||||
import com.yunbao.main.R;
|
||||
import com.yunbao.main.adapter.SearchResultsAdapter;
|
||||
import com.yunbao.main.event.AnchorSearchEvent;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用戶展示列表頁面
|
||||
*/
|
||||
public class UserSearchResultsItemViewHolder extends RecyclerView.ViewHolder {
|
||||
private RecyclerView anchorList;
|
||||
private TextView anchorMore;
|
||||
private SearchResultsAdapter resultsAdapter;
|
||||
private FrameLayout typeTitle;
|
||||
|
||||
public UserSearchResultsItemViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
anchorList = itemView.findViewById(R.id.anchor_list);
|
||||
anchorMore = itemView.findViewById(R.id.anchor_more);
|
||||
typeTitle = itemView.findViewById(R.id.type_title);
|
||||
anchorMore.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Bus.get().post(new AnchorSearchEvent().setJumpType(2));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void showAnchors(List<SearchModel> searchModels, int type) {
|
||||
resultsAdapter = new SearchResultsAdapter();
|
||||
anchorList.setLayoutManager(new LinearLayoutManager(itemView.getContext(), LinearLayoutManager.VERTICAL, true));
|
||||
anchorList.setAdapter(resultsAdapter);
|
||||
resultsAdapter.putData(searchModels, type);
|
||||
//滾動到頂部
|
||||
anchorList.smoothScrollToPosition(0);
|
||||
}
|
||||
public void hideTypeTitle(){
|
||||
typeTitle.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
10
main/src/main/res/drawable/background_search_chip.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="12dp" />
|
||||
<solid android:color="#FFF6F6F6" />
|
||||
<padding android:bottom="7dp" android:left="11dp" android:right="11dp" android:top="7dp" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
9
main/src/main/res/drawable/tablayout_indicator_bg.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:gravity="center_horizontal">
|
||||
<shape>
|
||||
<corners android:radius="5dp" />
|
||||
<size android:width="20dp"
|
||||
android:height="4dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</layer-list>
|
||||
@@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout 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:background="@color/white"
|
||||
android:orientation="vertical">
|
||||
android:orientation="vertical"
|
||||
android:paddingTop="17dp">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
@@ -16,14 +16,14 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:paddingLeft="10dp"
|
||||
android:paddingLeft="15dp"
|
||||
android:paddingRight="10dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="30dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginRight="10dp"
|
||||
android:layout_marginRight="15dp"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/bg_search_input_2"
|
||||
android:orientation="horizontal">
|
||||
@@ -33,7 +33,7 @@
|
||||
android:layout_height="20dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:src="@mipmap/icon_main_search" />
|
||||
android:src="@mipmap/icon_searchbar" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/edit"
|
||||
@@ -58,75 +58,15 @@
|
||||
android:gravity="center"
|
||||
android:onClick="backClick"
|
||||
android:text="@string/cancel"
|
||||
android:textColor="@color/gray1"
|
||||
android:textColor="#FF000000"
|
||||
android:textSize="16sp" />
|
||||
</LinearLayout>
|
||||
</FrameLayout>
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/search_view"
|
||||
<FrameLayout
|
||||
android:id="@+id/context_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:text="搜索历史"
|
||||
android:textColor="@color/black1"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/search_del"
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="20dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginRight="10dp"
|
||||
android:background="@mipmap/search_del" />
|
||||
</RelativeLayout>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/list_record"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:background="@color/color_white" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/lt_search_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
|
||||
<net.lucode.hackware.magicindicator.MagicIndicator
|
||||
android:id="@+id/magic_indicator"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:background="@color/color_white" />
|
||||
|
||||
<androidx.viewpager.widget.ViewPager
|
||||
android:id="@+id/vp_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp" />
|
||||
|
||||
<com.yunbao.common.custom.CommonRefreshView
|
||||
android:id="@+id/refreshView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="1dp"
|
||||
android:layout_weight="1"
|
||||
app:crv_itemCount="50"
|
||||
app:crv_refreshEnable="false" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="20dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginRight="20dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/type_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:background="@mipmap/icon_zhubo" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/anchor" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/anchor_more"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|right"
|
||||
android:drawableRight="@mipmap/icon_more"
|
||||
android:drawablePadding="5dp"
|
||||
android:text="@string/anchor_more" />
|
||||
</FrameLayout>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/anchor_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp" />
|
||||
</LinearLayout>
|
||||
11
main/src/main/res/layout/view_search_recommend.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/search_recommend_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
</LinearLayout>
|
||||
16
main/src/main/res/layout/view_search_recommend_body.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="11dp">
|
||||
|
||||
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/live_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="24dp" />
|
||||
|
||||
</LinearLayout>
|
||||
37
main/src/main/res/layout/view_search_recommend_heard.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="11dp">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/search_history"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:textColor="#FF000000"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/search_del"
|
||||
android:layout_width="30dp"
|
||||
android:layout_height="30dp"
|
||||
android:layout_gravity="end"
|
||||
android:src="@mipmap/search_del" />
|
||||
</FrameLayout>
|
||||
|
||||
<com.yunbao.main.views.FlowLayout
|
||||
android:id="@+id/search_history"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="100dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:padding="5dp" />
|
||||
|
||||
</LinearLayout>
|
||||
49
main/src/main/res/layout/view_search_results.xml
Normal file
@@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout 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:background="@color/white"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
android:id="@+id/search_type"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:background="@color/white"
|
||||
app:tabGravity="center"
|
||||
app:tabIndicator="@drawable/tablayout_indicator_bg"
|
||||
app:tabIndicatorColor="#FFFF8D41"
|
||||
app:tabIndicatorHeight="4dp"
|
||||
app:tabMode="fixed"
|
||||
app:tabPaddingEnd="20dp"
|
||||
app:tabPaddingStart="20dp"
|
||||
app:tabSelectedTextColor="#FFFF8D41"
|
||||
app:tabTextAppearance="@style/TabLayoutTextStyle"
|
||||
app:tabTextColor="#FF000000">
|
||||
|
||||
<com.google.android.material.tabs.TabItem
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/all" />
|
||||
|
||||
<com.google.android.material.tabs.TabItem
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/anchor" />
|
||||
|
||||
<com.google.android.material.tabs.TabItem
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/user" />
|
||||
</com.google.android.material.tabs.TabLayout>
|
||||
|
||||
<androidx.viewpager.widget.ViewPager
|
||||
android:id="@+id/context_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
||||
38
main/src/main/res/layout/view_search_results_item.xml
Normal file
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout 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:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/loading"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="100dp"
|
||||
android:layout_gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center"
|
||||
android:visibility="gone">
|
||||
|
||||
<com.wang.avi.AVLoadingIndicatorView
|
||||
android:id="@+id/avi"
|
||||
style="@style/AVLoadingIndicatorView"
|
||||
android:layout_width="60dp"
|
||||
android:layout_height="60dp"
|
||||
android:visibility="visible"
|
||||
app:indicatorColor="@color/blue_337cf5"
|
||||
app:indicatorName="LineScaleIndicator" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/refresh_header_loading"
|
||||
android:textColor="@color/black3" />
|
||||
</LinearLayout>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/search_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
</FrameLayout>
|
||||
71
main/src/main/res/layout/view_search_results_item_holder.xml
Normal file
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="65dp"
|
||||
android:orientation="horizontal"
|
||||
android:paddingTop="10dp">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="60dp"
|
||||
android:layout_height="60dp">
|
||||
|
||||
<com.yunbao.main.views.ClipPathCircleImage
|
||||
android:id="@+id/avatar"
|
||||
android:layout_width="55dp"
|
||||
android:layout_height="55dp" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/is_live"
|
||||
android:layout_width="55dp"
|
||||
android:layout_height="25dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:src="@mipmap/icon_user_home_living" />
|
||||
</RelativeLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginLeft="19dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/nick_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/anchor_more"
|
||||
android:textColor="#FF161616"
|
||||
android:textSize="14sp" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:gravity="bottom">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/sex"
|
||||
android:layout_width="19dp"
|
||||
android:layout_height="19dp"
|
||||
android:src="@mipmap/icon_sex_female_1" />
|
||||
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/contribute"
|
||||
android:layout_width="55dp"
|
||||
android:layout_height="20dp" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/focus_on"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:src="@mipmap/btn_add" />
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="20dp"
|
||||
android:layout_marginRight="20dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/type_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:background="@mipmap/icon_yongh" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/user" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/anchor_more"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical|right"
|
||||
android:drawableRight="@mipmap/icon_more"
|
||||
android:drawablePadding="5dp"
|
||||
android:text="@string/anchor_more" />
|
||||
</FrameLayout>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/anchor_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp" />
|
||||
</LinearLayout>
|
||||
BIN
main/src/main/res/mipmap-xxhdpi/btn_add.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
main/src/main/res/mipmap-xxhdpi/icon_cange.png
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
BIN
main/src/main/res/mipmap-xxhdpi/icon_contribute.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
main/src/main/res/mipmap-xxhdpi/icon_more.png
Normal file
|
After Width: | Height: | Size: 724 B |
BIN
main/src/main/res/mipmap-xxhdpi/icon_searchbar.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
main/src/main/res/mipmap-xxhdpi/icon_yongh.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
main/src/main/res/mipmap-xxhdpi/icon_zhubo.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
@@ -18,4 +18,10 @@
|
||||
<item name="android:taskToBackEnterAnimation">@null</item>
|
||||
<item name="android:taskToBackExitAnimation">@null</item>
|
||||
</style>
|
||||
<style name="CAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/colorAccent</item>
|
||||
<item name="android:colorBackground">@color/background</item>
|
||||
</style>
|
||||
</resources>
|
||||