基于数据挖掘的旅游推荐APP(三):热门景点模块
生活随笔
收集整理的這篇文章主要介紹了
基于数据挖掘的旅游推荐APP(三):热门景点模块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??????? 該模塊數據來源于百度搜索風云榜之今日風景名勝排行榜(鏈接),通過調用托管在神箭手云上的API接口可以實現數據的實時抓取,可以參考這里。
??????? 效果圖:
??????????????????????
??????? 接著上一篇繼續說,該模塊對應LauchFragment,代碼如下:
LaunchFragment.java
public class LaunchFragment extends Fragment {private static final String TAG="LaunchFragment";private RecyclerView mRecyclerView;private List<HotSpotRankItem> mItems= new ArrayList<>(); //這里必須寫= new ArrayList<>(),否則可能空指針報錯//多線程原因,后臺聯網下載時,主線程運行,當運行到getItemCount時報錯public static LaunchFragment newInstance(){return new LaunchFragment();}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setRetainInstance(true);new FetchItemsTask().execute();}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View v=inflater.inflate(R.layout.fragment_launch,container,false);mRecyclerView=(RecyclerView) v.findViewById(R.id.hotspot_recycler_view);mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));setupAdapter();return v;}private void setupAdapter() {if (isAdded()) {//mItems=new BaiDuTopFetchr().fetchItems();//由于多線程運行,需要先判斷fragment是否和activity連接mRecyclerView.setAdapter(new HotSpotAdapter(mItems));}}private class HotSpotHolder extends RecyclerView.ViewHolder{private TextView mRankTextView;private TextView mKeywordTextView;private TextView mIndexTextView;private HotSpotRankItem mHotSpotRankItem;public HotSpotHolder(View itemView) {super(itemView);mRankTextView=(TextView)itemView.findViewById(R.id.hotspot_rank);mKeywordTextView=(TextView)itemView.findViewById(R.id.hotspot_keyword);mIndexTextView=(TextView)itemView.findViewById(R.id.hotspot_index);}public void bindHotSpot(HotSpotRankItem hotspot){mRankTextView.setText(hotspot.getRank());mKeywordTextView.setText(hotspot.getKeyword());mIndexTextView.setText("搜索指數:"+hotspot.getIndex());}}private class HotSpotAdapter extends RecyclerView.Adapter<HotSpotHolder>{private List<HotSpotRankItem> mHotSpotRankItems;public HotSpotAdapter(List<HotSpotRankItem> hotSpotRankItems) {mHotSpotRankItems = hotSpotRankItems;}@Overridepublic HotSpotHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view=LayoutInflater.from(getActivity()).inflate(R.layout.list_item_hotspot,parent,false);return new HotSpotHolder(view);}@Overridepublic void onBindViewHolder(HotSpotHolder holder, int position) {HotSpotRankItem hotspot=mHotSpotRankItems.get(position);holder.bindHotSpot(hotspot);}@Overridepublic int getItemCount() {return mHotSpotRankItems.size();}}private class FetchItemsTask extends AsyncTask<Void,Void,List<HotSpotRankItem>> {@Overrideprotected List<HotSpotRankItem> doInBackground(Void... params) {Log.i(TAG,"do in back");return new BaiDuTopFetchr().fetchItems();}@Overrideprotected void onPostExecute(List<HotSpotRankItem> hotSpotRankItems) {Log.i(TAG,"return otems");mItems=hotSpotRankItems;setupAdapter();}} }????????API調用及返回的json數據解析:
BaiDuTopFetchr.java
public class BaiDuTopFetchr {private String mAppid="80b574f8abf4224cee648bb060984015";private String mHttpUrl = "http://api.shenjian.io/";private String mHttpArg = "appid="+mAppid;private static final String TAG = "BaiDuTopFetchr";public String request(String httpUrl, String httpArg) {BufferedReader reader=null;String result=null;StringBuffer sbf=new StringBuffer();httpUrl=httpUrl+"?"+httpArg;try {URL url=new URL(httpUrl);HttpURLConnection connection=(HttpURLConnection)url.openConnection();connection.setRequestMethod("GET");connection.connect();InputStream is=connection.getInputStream();reader=new BufferedReader(new InputStreamReader(is,"UTF-8"));String strRead = null;while ((strRead = reader.readLine()) != null) {sbf.append(strRead);sbf.append("\r\n");}reader.close();result = sbf.toString();}catch (Exception e) {e.printStackTrace();}return result;}public List<HotSpotRankItem> fetchItems() {List<HotSpotRankItem> items = new ArrayList<>();try {String jsonString = request(mHttpUrl,mHttpArg);Log.i(TAG, "Received JSON: " + jsonString);JSONObject jsonBody = new JSONObject(jsonString);parseItems(items, jsonBody);} catch (IOException ioe) {Log.e(TAG, "Failed to fetch items", ioe);} catch (JSONException je) {Log.e(TAG, "Failed to parse JSON", je);}return items;}private void parseItems(List<HotSpotRankItem> items, JSONObject jsonBody)throws IOException, JSONException {JSONArray hotSpotJsonArray = jsonBody.getJSONArray("data");for (int i = 0; i < hotSpotJsonArray.length(); i++) {JSONObject hotSpotJsonObject = hotSpotJsonArray.getJSONObject(i);HotSpotRankItem item = new HotSpotRankItem();item.setRank(hotSpotJsonObject.getString("rank"));item.setKeyword(hotSpotJsonObject.getString("keyword"));item.setIndex(hotSpotJsonObject.getString("index"));items.add(item);}} }HotSpotRankItem.java
public class HotSpotRankItem {private String mRank;private String mKeyword;private String mIndex;public String getRank() {return mRank;}public void setRank(String rank) {mRank = rank;}public String getKeyword() {return mKeyword;}public void setKeyword(String keyword) {mKeyword = keyword;}public String getIndex() {return mIndex;}public void setIndex(String index) {mIndex = index;}}布局文件:
fragment_launch.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.RecyclerViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/hotspot_recycler_view"android:layout_width="match_parent"android:layout_height="wrap_content"/>list_item_hotspot.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/hotspot_rank"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:padding="4dp"/><TextViewandroid:id="@+id/hotspot_keyword"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:padding="4dp"/><TextViewandroid:id="@+id/hotspot_index"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:padding="4dp"/></LinearLayout>源代碼在前面博客里。總結
以上是生活随笔為你收集整理的基于数据挖掘的旅游推荐APP(三):热门景点模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于数据挖掘的旅游推荐APP(二):主界
- 下一篇: 基于数据挖掘的旅游推荐APP(四):“我