之前,有介紹過如何自訂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;
}
}
}
執行起來的畫面: