Android——“i 分享”APP開發Day06

繼續上一篇的內容,寫FindFragment.java文件,在上一篇的三個函數基礎上基本就可以展示出熱門內容了,接下來主要就是處理找人和找文按鈕的事件

  1. 因爲之後還需要實現找人的功能,所以要先給創建一個存放用戶信息的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);
        }
    }
}

 

——查找頁面到這裏差不多就告一段落啦,至於進入詳情就留到後面再講,接下來會先處理一下發布頁 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章