前言
其实到了这一篇基本上就已经到了最后,我们再来只要将切好的资料放进对应好的栏位里面就完成了
那这边为了将尽量做到 MVC 的架构(对 Android 还是不够熟没办法做到很完整的切割...),所以在这边我将 ListView 中的 item 取出个别处理,这样的好处还有我们可以针对 ListView 中每个栏位的显示样式做自定义,让显示的内容更符合我们的需求。
开工
这一篇简单的概念有了,就让我们开始吧~
首先我们得加入一个 list_item.xml,他将会是我们后面显示的栏位
在这边一样先附上在这边一样先附上截图,可以自己刻自己需要的样式不一定要一模一样,若是不清楚可以在最后的连结去取得档案来看。
接着我们就要来撰写这些 item 的运作了,首先我们需要新增一个 ItemArrayAdapter.java 它的功用会是我们后续将处理完的资料放进来,再将其对应到相对栏位的相对元件之中的控制。
以及未来我们 ListView 内容在初始化以及刷新时的控制机制也会在这边进行约束。
ItemArrayAdapter.java
@Overridepublic int getCount() { return this.maskInfoList.size();}@Overridepublic String[] getItem(int index) { return this.maskInfoList.get(index);}@Overridepublic View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { View row = convertView; ItemViewHolder viewHolder; if (row == null) { LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); row = inflater.inflate(R.layout.list_item, parent, false); viewHolder = new ItemViewHolder(); viewHolder.pharmacyname = (TextView) row.findViewById(R.id.pharmacy_name_textView); viewHolder.pharmacyaddress = (TextView) row.findViewById(R.id.pharmacy_address_textView); viewHolder.telephone = (TextView) row.findViewById(R.id.telephone_textView); viewHolder.adultmaskamount = (TextView) row.findViewById(R.id.adult_amount_textView); viewHolder.childmaskamount = (TextView) row.findViewById(R.id.child_amount_textView); viewHolder.updatetime = (TextView) row.findViewById(R.id.update_time_textView); row.setTag(viewHolder); } else { viewHolder = (ItemViewHolder) row.getTag(); } String[] stat = getItem(position); viewHolder.pharmacyname.setText(stat[1]); viewHolder.pharmacyaddress.setText(stat[2]); viewHolder.telephone.setText(stat[3]); viewHolder.adultmaskamount.setText("成人口罩剩余数: " + stat[4]); viewHolder.childmaskamount.setText("儿童口罩剩余数: " + stat[5]); viewHolder.updatetime.setText(stat[6]); Log.v("Test", "setvalue"); return row;}
这一个部分先是针对数量、内容、以及将这些内容放到对应来未的机制进行规範。
接着就是要来针对初始化以及刷新的部分进行撰写,第一个 PersonAdapter() 就是我们初始化的部分,refresh() 如其名的就是刷新的部分,再刷新的部分我们使用notifyDataSetChanged() 来处理资料刷新,使用这个方法的话就只会针对表格内有异动的栏位进行修改,而不需要将整个表格物件重置再建立,虽然在目前内容不吃资源的情况下差别不大,但要是我们今天会读取较大资料或是图档时就会造成大量重複刷新的资源耗损。
public void PersonAdapter(ArrayList<String[]> list) { maskInfoList = list;}public void refresh(ArrayList<String[]> list) { maskInfoList = list; notifyDataSetChanged();}
在完成了 ItemArrayAdapter.java 之后,我们就要把我们切丸的资料正式放入我们的 ListView 之中了,我们回到 MainActivity.java 中。
我们需要对 进行一些修改,让这部分可以在下载资料的前后做一些处理,来让资料顺利放入。
private void dialogAndDownload() { ProgressDialog dialog = new ProgressDialog(this, ProgressDialog.STYLE_SPINNER); dialog.setTitle("请稍后"); dialog.setMessage("取得资料中..."); dialog.setCancelable(false); dialog.show(); if (isFirst) { initialListAndAdapter(); } else { maskInfoList.clear(); itemArrayAdapter.clear(); } new Thread(() -> { downloadData(); runOnUiThread(new Runnable() { @Override public void run() { if (isFirst) { isFirst = false; itemArrayAdapter.PersonAdapter((ArrayList<String[]>) maskInfoList); } else { itemArrayAdapter.refresh((ArrayList<String[]>) maskInfoList); } } }); dialog.dismiss(); }).start();}
接着补上初始化我们 listView 以及 itemArrayAdapter 的 function。
private void initialListAndAdapter() { maskInfoList.clear(); listView = (ListView) findViewById(R.id.maskListView); itemArrayAdapter = new ItemArrayAdapter(getApplicationContext(), R.layout.list_item); Parcelable state = listView.onSaveInstanceState(); listView.setAdapter(itemArrayAdapter); listView.onRestoreInstanceState(state);}
最后在字串处理完后的地方加入 maskInfoList.add(row);
让处理好的资料夹入 ListView 会用到的 List 之中。
while ((csvLine = reader.readLine()) != null) { String[] row = csvLine.split(","); if (selectedCity >= 0 && row[2].substring(0, 3).equals(cityArray[selectedCity])) { maskInfoList.add(row); }}
到这边基本上应该只要补上一些残余的宣告就完成我们所有的工作了。
这一篇尽量省略一些比较累赘的部分,因此若是只照着上面的东西贴上去一定没办法直接跑,会需要加一些宣告跟小东西,不过这部分就不赘述,不然实在有点多余。