Android前後端gson傳輸資料和listview獲取position

SwordFly發表於2016-07-25

這個暑假學校安排一個月的實訓,內容就是,一個團隊開發一個app,相信對於有經驗的人來說是很簡單的事,但是我在此之前從來沒有接觸過Android,java基礎也接近於0,所以開發過程中遇到了很多問題,剛好專案經理要求我們寫寫技術總結,就把寫好的東西發到這裡,當作記錄吧。

1、 如何在前後端之間進行資料的傳輸
這是最初擺在我面前的一道難題,具體來說問題是這樣的:如何獲取到手機前端中的資料?如何將它傳送給後端?如何獲取後端資料庫反饋到前端的資訊?

第一個問題比較簡單,獲取前端的資料主要是來自TextView或者SP檔案,如何獲取TextView的資料就不需要說了,獲取Sp檔案中的資料則需要用到一些SharedPreference中的函式

SharedPreferences pref = getSharedPreferences("user_data",MODE_PRIVATE);

也是很簡單的。
對於第二個問題,方法應該是很多的,但是目前會用的只有老師教的方法,通過http協議作為通訊方式,用gson包裝資料,具體程式碼就像這樣的:

String path = "http://" + ip.ip + "/Hello_Web/loginServlet";
path = path + "?&account=" + account + "&password=" + passwd;
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();

這是實現登入模組的,其中path也就是http通訊的表單,表單格式一般是:


http://192.168.1.102:8080/Hello_Web/ loginServlet?+……

其中192.168.1.102:8080是我們後端的ip埠,也就是阿黃電腦的ip,Hello_Web/ loginServlet是後端處理登入事件的Servlet名稱,在”?”之後要寫的則是要傳輸的資料名稱和內容,比如”&account=”+account,&account是一個自己定義的名字,在後端會通過這個名稱來獲取資料,資料也就是account的值;如果要傳輸的是一批資料的話,通過這種方式一個一個填太麻煩了,那麼就要用到gson了,gson是json的一個變種吧,比如可以用gson封裝一個物件的資料,甚至是一個列表的資料,都是很方便的。

第三個問題的話,如果不牽涉到圖片,也是比較簡單的,如果想要知道圖片我們是怎麼處理的話,建議去看其他幾位組員的部落格。
因為後端在處理髮送反饋時,一般是通過outprint(data),data一般是一個字串,前端在接收這個資料時,需要一連串的處理,才能獲取到這個字串,比如:


URLConnection conn = url.openConnection;
InputStream stream = conn.getInputStream();
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader br = new BufferedReader(reader);
str = br.readLine();

通過這樣一系列的流操作,位元組轉換,最終獲取到的str也就是後端返回的資料,至於怎麼把這個返回的資料變成我們要顯示到前端的東西,又是另外一個問題了。

2、 如何刪除ListView中的某一項,之後更新該ListView並獲取到該項的資訊。
遇到這個問題是在要實現收藏列表的刪除時,收藏列表就是一個listview,在這個listview上有一個刪除button,要在點選這個button時刪除這個位置的listview,並且獲取到這個listview中店鋪的id等資訊,從而傳送給後端,將資料庫中資訊一併刪除。
首先,需要自定義一個atapter來適配這個listview,這個adapter需要有OnClickListener介面:

 public class ContentAdapter extends BaseAdapter implements OnClickListener{}

並且需要有自定義介面,用於回撥按鈕點選事件到Activity :

private Callback mCallback;

    public interface Callback {
        public void click(View v);
    }

響應按鈕點選事件,呼叫子定義介面,並傳入View:

    @Override
    public void onClick(View v) {
        mCallback.click(v);
    }

在Activity中:


public class CollectStoreActivity extends Activity implements OnItemClickListener,Callback{}

要有CallBack的介面,同時在Activity中重寫click()方法:

 @Override
public void click(final View v) {

        final int position1 = (Integer)v.getTag();
        new AlertDialog.Builder(CollectStoreActivity.this).setTitle("提示資訊").setMessage("確認要取消收藏嗎?")
                .setCancelable(false).setPositiveButton("確認", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                System.out.println("----------------int the click: "+v.getTag());
                list2.remove(position1);
                contentAdapter.notifyDataSetChanged();
                lv.invalidate();
                if (list2.size()==0)
                {
                    collect_tv.setText("您當前沒有收藏店鋪");
                    collect_pic.setImageResource(R.mipmap.bg_empty);
                }
            }
        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        }).show();
}

在這裡的:

 list2.remove(position1);
 contentAdapter.notifyDataSetChanged();
 lv.invalidate();

就可以實現實時的刪除後更新listview,之後再將這個list2的內容寫入Sp檔案,與之前的資訊比較得出刪除的店鋪的id,重寫onBackPressed()方法,傳送給資料庫。

相關文章