欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

基于数据挖掘的旅游推荐APP(三):热门景点模块

发布时间:2025/3/21 编程问答 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 基于数据挖掘的旅游推荐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(三):热门景点模块的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。