iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 18
0
自我挑戰組

在Android Studio 3.x版開發Android系統的開發記事系列 第 18

在Android Studio 3.x版開發Android系統的開發記事-如何將JSON字串當資料來源跟自訂的ListView連結在起來

  • 分享至 

  • xImage
  •  
之前,有介紹過如何自訂ListView列表項目,當時是直接用已經宣告好的陣列來連結在一起。可是,這是就沒有可以變化的地方。例如:可以從資料庫取得資料,轉成JSON字串,回傳到Android。但是,要如何將JSON字串轉成ArrayList物件。再跟ListView結合起來。
如何自訂ListView,請參考我之前的文章。而這次修改好、完整的程式碼,如下所述。有跟之前不同的地方,請看註解。
public class MainActivity extends AppCompatActivity {

    ListView lsv_sports;

    ArrayList<Integer> aryimas;
    ArrayList<String> arysport;
    ArrayList<String> aryengsport;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lsv_sports = (ListView)findViewById(R.id.lsvsports);

        aryimas=new ArrayList<>();
        arysport=new ArrayList<>();
        aryengsport=new ArrayList<>();

        String strjson = "[{\"cname\":\"籃球\",\"ename\":\"basketball\"},{\"cname\":\"足球\",\"ename\":\"soccer\"},{\"cname\":\"排球\",\"ename\":\"volleyball\"}]";

        try{
            //將JSON字串,放到JSONArray中。
            JSONArray array = new JSONArray(strjson);

            //解出JSON的資料,將所要的資料,再寫入陣列中。
            for (int i = 0; i < array.length(); i++) {
                JSONObject jsonObject = array.getJSONObject(i);

                String strcname = jsonObject.getString("cname");
                String strename = jsonObject.getString("ename");

                aryimas.add(R.drawable.ball01);
                arysport.add(strcname);
                aryengsport.add(strename);
            }
        }
        catch(JSONException e) {
            e.printStackTrace();
        }

        // 建立自訂的 Adapter
        listlayoutadapter adasports=new listlayoutadapter(this);

        // 設定 ListView 的資料來源
        lsv_sports.setAdapter(adasports);
    }

    //自訂listlayoutadapter,繼承 BaseAdapter。
    //再實做出 getCount、getItem、getitemid、getView函式。
    public class listlayoutadapter extends BaseAdapter {

        private LayoutInflater listlayoutInflater;

        public listlayoutadapter(Context c){
            listlayoutInflater = LayoutInflater.from(c);
        }

        @Override
        public int getCount() {
            //取得ArrayList的總數 (要注意,跟array不同之處)
            return arysport.size();
        }

        @Override
        public Object getItem(int position) {
            //要用get(position)取得資料 (要注意,跟array不同之處)
            return  arysport.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            convertView = listlayoutInflater.inflate(R.layout.listlayout,null);

            //設定自訂樣板上物件對應的資料。
            ImageView img_logo = (ImageView) convertView.findViewById(R.id.imglogo);
            TextView lbl_name = (TextView) convertView.findViewById(R.id.lblname);
            TextView lbl_engname = (TextView) convertView.findViewById(R.id.lblengname);

            //要用get(position)取得資料 (要注意,跟array不同之處)
            img_logo.setImageResource(aryimas.get(position));
            lbl_name.setText(arysport.get(position));
            lbl_engname.setText(aryengsport.get(position));

            return convertView;
        }
    }
}

執行起來的畫面:
https://ithelp.ithome.com.tw/upload/images/20181024/20000953C8GjDfAUKo.jpg


上一篇
在Android Studio 3.x版開發Android系統的開發記事-如何使用Google Map(下)
下一篇
在Android Studio 3.x版開發Android系統的開發記事-如何實做書籍管理系統(一)
系列文
在Android Studio 3.x版開發Android系統的開發記事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言