繼續上一篇的內容,寫FindFragment.java文件,在上一篇的三個函數基礎上基本就可以展示出熱門內容了,接下來主要就是處理找人和找文按鈕的事件
- 因爲之後還需要實現找人的功能,所以要先給創建一個存放用戶信息的bean文件
- 在com.example.bean包下面創建一個java文件——FindPeople.java
- 處理對用戶相關屬性的設置與獲取
——FindPeople.java文件完整代碼如下
package com.example.bean; public class FindPeople { String userName; //用戶暱稱 String signature; //用戶簽名 String userLogImage; //用戶頭像 String passWord; //用戶密碼 public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getSignature() { return signature; } public void setSignature(String signature) { this.signature = signature; } public String getUserLogImage() { return userLogImage; } public void setUserLogImage(String userLogImage) { this.userLogImage = userLogImage; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } }
2.接下來就開始處理找人和找文兩個按鈕的事件
- 給找文按鈕添加事件,在點擊時獲取到用戶輸入的內容
- 將請求的內容發送到後臺服務,獲取到相關用戶的信息,解析返回的Json並將數據存到bean中,然後通過適配器更新UI
- 同樣的,點擊找人按鈕時也是獲取到輸入內容然後向後臺服務請求數據,在這一步需要的適配器和Json數據處理與上述的內容處理不同,所以需要另外創建
- 比較需要注意的就是每一次網絡請求之後,都需要清空ListView中的內容,重新初始化適配器,讓查詢內容更新到頁面
- 處理清空輸入框按鈕的事件,在點擊清空時,一方面是要將EditText中的內容設置爲空,同時應該讓ListView的內容更新爲熱門內容
——講了那麼多,處理邏輯其實都是類似的,詳見FindTabFragment.java文件內容,完整代碼如下:
package com.example.discover; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.StrictMode; import android.support.v4.app.Fragment; import android.support.v4.app.INotificationSideChannel; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; import com.example.bean.FindInfo; import com.example.bean.FindPeople; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; public class FindTabFragment extends Fragment implements AbsListView.OnScrollListener{ Activity mActivity; //存放當前的activity String baseUrl = "http://10.0.2.2:8080/iShareService/servlet/"; //web服務器的地址 String imgBaseUrl = "http://10.0.2.2:8080/iShareService/images/"; //圖片資源 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View findLayout = inflater.inflate(R.layout.find_tab_content, container, false); return findLayout; } private ListView listView; private EditText searchView; //搜索內容框 private Button clearInfo; //找文按鈕 private Button seekPeople; //找人按鈕 private Button seekInfo; //找文按鈕 private TextView hintTv; //提示信息 private String keyWord; //搜索框的文 private Boolean isHot = true; //用於判斷加載熱文還是查找的內容 private int page = 1; //請求頁數 private int visibleLastIndex = 0; //最後的可視項索引 private int visibleItemCount; // 當前窗口可見項總數 private int dataSize = 28; //數據集的條數 private FindTabFragment.PaginationAdapter adapter; //存放熱門和查文信息 private FindTabFragment.PeopleAdapter peopleAdapter; //存放查人 private Handler handler = new Handler(); //返回測試信息 /*TextView testTxt;*/ /** Called when the activity is first created. */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //返回測試信息 /* testTxt = (TextView)getActivity().findViewById(R.id.test_discover_tab);*/ listView = (ListView)getActivity().findViewById(R.id.find_listView); /* listView.addFooterView(loadMoreView); //設置列表底部視圖*/ initializeAdapter(); //初始化,填入熱門 listView.setAdapter(adapter); /*listView.setOnScrollListener(this);*/ //輸入框 searchView = (EditText)getActivity().findViewById(R.id.et_seek_search); //找人、找文按鈕、清空文本框內容的button seekPeople = (Button) getActivity().findViewById(R.id.find_search_by_name); seekInfo = (Button) getActivity().findViewById(R.id.find_search_by_keyWord); clearInfo = (Button) getActivity().findViewById(R.id.seek_bt_clear); //提示信息 hintTv = (TextView) getActivity().findViewById(R.id.seek_list_hint_info); seekPeople.setOnClickListener(new mClick()); seekInfo.setOnClickListener(new mClick()); clearInfo.setOnClickListener(new mClick()); } class mClick implements View.OnClickListener { public void onClick(View v) { keyWord = searchView.getText().toString(); if(keyWord == ""){ Toast.makeText(getActivity(), "查找內容不能爲空!", Toast.LENGTH_LONG).show(); return; } if (v == seekPeople) { //點擊了找人 hintTv.setText("查詢結果:"); listView.setAdapter(null); //將ListView控件的內容清空 initSearchPeopleAdapter(); listView.setAdapter(peopleAdapter); //將查詢結果插入頁面 peopleAdapter.notifyDataSetChanged(); }else if(v == seekInfo){ //點擊了找文 isHot = false; hintTv.setText("查詢結果:"); listView.setAdapter(null); initSearchInfoAdapter(); listView.setAdapter(adapter); adapter.notifyDataSetChanged(); }else if(v == clearInfo){ //點擊了清空 isHot = true; hintTv.setText("大家都在看:"); listView.setAdapter(null); initializeAdapter(); //初始化,填入熱門 listView.setAdapter(adapter); adapter.notifyDataSetChanged(); searchView.setText(""); } } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { int itemsLastIndex = adapter.getCount()-1; //數據集最後一項的索引 int lastIndex = itemsLastIndex + 1; if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && visibleLastIndex == lastIndex) { // 如果是自動加載,可以在這裏放置異步加載數據的代碼 } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { this.visibleItemCount = visibleItemCount; visibleLastIndex = firstVisibleItem + visibleItemCount - 1; //最後的可視項索引 //如果所有的記錄選項等於數據集的條數,則移除列表底部視圖 if(totalItemCount == dataSize+1){ Toast.makeText(getActivity(), "數據全部加載完!", Toast.LENGTH_LONG).show(); } } /** * 查詢數據庫中的數據 */ private JSONArray loadDataFromDataBase(String QueryInfoUrl){ //Toast.makeText(getActivity(),"保存",Toast.LENGTH_SHORT).show(); StringBuilder stringBuilder = new StringBuilder(); BufferedReader buffer = null; HttpURLConnection connGET = null; try { URL url = new URL(QueryInfoUrl); connGET = (HttpURLConnection) url.openConnection(); connGET.setConnectTimeout(5000); connGET.setRequestMethod("GET"); if (connGET.getResponseCode() == 200) { buffer = new BufferedReader(new InputStreamReader(connGET.getInputStream())); for (String s = buffer.readLine(); s != null; s = buffer.readLine()) { stringBuilder.append(s); } //返回測試信息 JSONArray jsonArray = new JSONArray(stringBuilder.toString()); /* testTxt.setText(baseUrl+"QueryDiscover?page="+page+"&count="+count);*/ //獲取到的數據,對Json進行解析 page = page+1; //一次成功請求後更新請求頁面 buffer.close(); return jsonArray; }else{ Toast.makeText(getActivity(),"非200", Toast.LENGTH_LONG).show(); } } catch (Exception e) { e.printStackTrace(); Toast.makeText(getActivity(), "get 提交 err.." + e.toString(), Toast.LENGTH_LONG).show(); } return null; } //初始化將詳情設置到FindInfo bean中 public List<FindInfo> initSetDataToBean(String detail){ List<FindInfo> findInfo = new ArrayList<FindInfo>(); try { JSONArray detailJsonArray = new JSONArray(detail); for (int i = 0; i < detailJsonArray.length(); i++) { FindInfo items = new FindInfo(); JSONObject temp = (JSONObject) detailJsonArray.get(i); Integer infoId = temp.getInt("infoId"); //內容ID String infoTitle = temp.getString("infoTitle"); //內容標題 String infoDescribe = temp.getString("infoDescribe"); //內容簡述 String infoDetail = temp.getString("infoDetail"); //內容詳情 Integer type = temp.getInt("infoType"); //類型:0表示日記,1表示趣事 Integer support = temp.getInt("infoSupport"); //點贊數 String infoAuthor = temp.getString("infoAuthor"); //作者 items.setInfoId(infoId); items.setInfoTitle(infoTitle); items.setInfoDescribe(infoDescribe); items.setInfoDetail(infoDetail); items.setType(type); items.setSupport(support); items.setInfoAuthor(infoAuthor); findInfo.add(items); } return findInfo; }catch (JSONException e){ Toast.makeText(getActivity(), "initSetDataToBean異常 err.." + e.toString(), Toast.LENGTH_LONG).show(); return null; } } //初始化將詳情設置到FindInfo bean中 public List<FindPeople> initSetPeopleDataToBean(String detail){ List<FindPeople> findPeople = new ArrayList<FindPeople>(); try { JSONArray detailJsonArray = new JSONArray(detail); for (int i = 0; i < detailJsonArray.length(); i++) { FindPeople items = new FindPeople(); JSONObject temp = (JSONObject) detailJsonArray.get(i); String userName = temp.getString("userName"); //用戶暱稱 String signature = temp.getString("signature"); //用戶簽名 String userLogImage = temp.getString("userLogImage"); //用戶頭像 items.setUserName(userName); items.setSignature(signature); items.setUserLogImage(userLogImage); findPeople.add(items); } return findPeople; }catch (JSONException e){ Toast.makeText(getActivity(), "initSetPeopleDataToBean異常 err.." + e.toString(), Toast.LENGTH_LONG).show(); return null; } } /** * 初始化ListView的適配器,即打開頁面展示的數據 */ private void initializeAdapter(){ // 設置線程策略 setVersion(); String QueryHotInfoUrl = baseUrl+"QueryHotInfo"; JSONArray jsonArray = loadDataFromDataBase(QueryHotInfoUrl); try { JSONObject totalObject = (JSONObject)jsonArray.get(0); dataSize = totalObject.getInt("totalRecord"); //總記錄數 String detail= totalObject.getString("RecordDetail"); //詳情 if(initSetDataToBean(detail)!=null) { adapter = new PaginationAdapter(initSetDataToBean(detail)); //將詳情設置到bean中 } }catch (JSONException e){ Toast.makeText(getActivity(), "initializeAdapter異常 err.." + e.toString(), Toast.LENGTH_LONG).show(); } } /** * 初始化ListView的適配器,將查找文結果顯示出來 */ private void initSearchInfoAdapter(){ // 設置線程策略 setVersion(); String QueryHotInfoUrl = baseUrl+"QueryInfoByKey?key="+keyWord; JSONArray jsonArray = loadDataFromDataBase(QueryHotInfoUrl); try { JSONObject totalObject = (JSONObject)jsonArray.get(0); dataSize = totalObject.getInt("totalRecord"); //總記錄數 String detail= totalObject.getString("RecordDetail"); //詳情 if(initSetDataToBean(detail)!=null) { adapter = new PaginationAdapter(initSetDataToBean(detail)); //將詳情設置到bean中 } }catch (JSONException e){ Toast.makeText(getActivity(), "initializeAdapter異常 err.." + e.toString(), Toast.LENGTH_LONG).show(); } } /** * 初始化ListView的適配器,將查找人結果顯示出來 */ private void initSearchPeopleAdapter(){ // 設置線程策略 setVersion(); String QueryPeopleInfoUrl = baseUrl+"QueryPeopleInfoByKey?nameKey="+keyWord; JSONArray jsonArray = loadDataFromDataBase(QueryPeopleInfoUrl); try { JSONObject totalObject = (JSONObject)jsonArray.get(0); dataSize = totalObject.getInt("totalRecord"); //總記錄數 String detail= totalObject.getString("RecordDetail"); //詳情 if(initSetPeopleDataToBean(detail)!=null) { peopleAdapter = new PeopleAdapter(initSetPeopleDataToBean(detail)); //將詳情設置到bean中 } }catch (JSONException e){ Toast.makeText(getActivity(), "initializeAdapter異常 err.." + e.toString(), Toast.LENGTH_LONG).show(); } } //APP如果在主線程中請求網絡操作,將會拋出異常,所以需要用線程來操作網絡請求 void setVersion() { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() //探測SQLite數據庫操作 .penaltyLog() //打印logcat .penaltyDeath() .build()); } /** * 將Int轉爲String */ private String IntToString(Integer num){ try { String str = num.toString(); //第幾頁 return str; } catch (NumberFormatException e) { e.printStackTrace(); } return null; } /** * 根據返回的文章類型設置卡片的樣式 */ class PaginationAdapter extends BaseAdapter { List<FindInfo> newsItems; public PaginationAdapter(List<FindInfo> newsitems){ this.newsItems = newsitems; } @Override public int getCount() { return newsItems.size(); } @Override public Object getItem(int position) { return newsItems.get(position); } @Override public long getItemId(int position) { return position; } //在這裏將Item設置到每個卡片 @Override public View getView(int position, View view, ViewGroup parent) { if(view == null){ view = getLayoutInflater().inflate(R.layout.activity_seek_list_item, null); } //將熱門標識去掉 if(!isHot){ TextView textViewImgBc = (TextView) view.findViewById(R.id.seek_list_textView); textViewImgBc.setCompoundDrawables(null, null, null, null); } //內容標題 TextView tvTitle = (TextView)view.findViewById(R.id.seek_list_textView); tvTitle.setText(newsItems.get(position).getInfoTitle()); //內容點贊數 TextView tvSupport = (TextView)view.findViewById(R.id.seek_list_textView2); String num = IntToString(newsItems.get(position).getSupport()); tvSupport.setText(num); return view; } /** * 添加數據列表項 * @param infoItem */ public void addNewsItem(FindInfo infoItem){ newsItems.add(infoItem); } } /** * 獲得屏幕寬度 * * @param context * @return */ public static int getScreenWidth(Context context) { WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.widthPixels; } /** * 根據返回的用戶設置卡片的樣式 */ class PeopleAdapter extends BaseAdapter { List<FindPeople> newsItems; public PeopleAdapter(List<FindPeople> newsitems){ this.newsItems = newsitems; } @Override public int getCount() { return newsItems.size(); } @Override public Object getItem(int position) { return newsItems.get(position); } @Override public long getItemId(int position) { return position; } //在這裏將Item設置到每個卡片 @Override public View getView(int position, View view, ViewGroup parent) { if(view == null){ view = getLayoutInflater().inflate(R.layout.activity_seek_list_item, null); } //用戶暱稱 TextView tvTitle = (TextView)view.findViewById(R.id.seek_list_textView); tvTitle.setText(newsItems.get(position).getUserName()); //用戶簽名 TextView tvSupport = (TextView)view.findViewById(R.id.seek_list_textView2); tvSupport.setText(newsItems.get(position).getSignature()); //用戶頭像 //通過網絡鏈接獲取圖片 String imgUrl = newsItems.get(position).getUserLogImage(); Bitmap one; ImageView userImg = (ImageView) view.findViewById(R.id.seek_list_imgView); /* //設置圖片大小自適應 int screenWidth = getScreenWidth(getContext()); ViewGroup.LayoutParams lp = userImg.getLayoutParams(); lp.width = screenWidth; lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; userImg.setLayoutParams(lp); userImg.setMaxWidth(screenWidth); userImg.setMaxHeight(screenWidth * 5); *//*這裏其實可以根據需求而定,我這裏測試爲最大寬度的5倍*/ try { one= LoadImgByNet.getBitmap(imgBaseUrl+imgUrl); userImg.setImageBitmap(one); }catch(IOException e){ e.printStackTrace(); } /*TableRow userImg = (TableRow) view.findViewById(R.id.seek_list_tableRow);*/ TextView textViewImgBc = (TextView) view.findViewById(R.id.seek_list_textView); textViewImgBc.setCompoundDrawables(null, null, null, null); /* String imgUrl = newsItems.get(position).getUserLogImage(); Bitmap one; try { one= LoadImgByNet.getBitmap(imgBaseUrl+imgUrl); *//*userImg.setBackground(new BitmapDrawable(getResources(),one)); //以背景的方式設置頭像*//* Drawable drawable = new BitmapDrawable(getResources(),one); // 這一步必須要做,否則不會顯示. drawable.setBounds(drawable.getMinimumWidth(), 0,0 , drawable.getMinimumHeight()); textViewImgBc.setCompoundDrawables(drawable, null, null, null); }catch(IOException e){ e.printStackTrace(); }*/ return view; } /** * 添加數據列表項 * @param infoItem */ public void addNewsItem(FindPeople infoItem){ newsItems.add(infoItem); } } }
——查找頁面到這裏差不多就告一段落啦,至於進入詳情就留到後面再講,接下來會先處理一下發布頁