Android Studio .csv檔讀寫
Android Studio .csv檔讀寫
可以先參考Android Studio 檔案讀寫內有寫關於Android Studio讀寫檔案基礎介紹
本次使用ArrayList存放CSV資料,使用RecyclerView顯示資料
建立ArrayList Data Model
新增DataModel的Java class
public class DataModel {
private String ID;
private String Name;
private String Score;
public DataModel(String ID, String Name, String Score){
this.ID = ID;
this.Name = Name;
this.Score = Score;
}
public String getID(){
return ID;
}
public String getName(){
return Name;
}
public String getScore(){
return Score;
}
}
並在Activity內宣告ArrayList
ArrayList<DataModel> datalist = new ArrayList<>()
建立RecyclerView & Adapter
在建立Adapter之前可以先建立ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView idtext, nametext, scoretext;
public ViewHolder(@NonNull View itemView) {
super(itemView);
idtext = (TextView) itemView.findViewById(R.id.idtext);
nametext = (TextView) itemView.findViewById(R.id.nametext);
scoretext = (TextView) itemView.findViewById(R.id.scoretext);
}
}
新增MainAdapter的Java class
public class MainAdapter extends RecyclerView.Adapter<ViewHolder>{
private LayoutInflater inflater;
private ArrayList<DataModel> dataM;
public MainAdapter(Context ctx, ArrayList<DataModel> datalist){
this.inflater = LayoutInflater.from(ctx);
this.dataM = datalist;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.recycle_item,parent,false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
DataModel data = dataM.get(position);
holder.idtext.setText(data.getID());
holder.nametext.setText(data.getName());
holder.scoretext.setText(data.getScore());
}
@Override
public int getItemCount() {
return dataM.size();
}
}
建立RecyclerView與Adapter連接
GridLayoutManager layoutManager = new GridLayoutManager(context, 1);
recycler.setLayoutManager(layoutManager);
mainAdapter = new MainAdapter(context,datalist);
recycler.setAdapter(mainAdapter);
讀取CSV檔
try{
File storage = Environment.getExternalStorageDirectory();
File file = new File(storage + "/TXT" , "TXT.csv");
InputStreamReader fw = new InputStreamReader(new FileInputStream(file), "UTF-8");
BufferedReader bw = new BufferedReader(fw); //將BufferedWeiter與FileWrite物件做連結
String thisLine ;
String thisaplit = ",";
while ((thisLine = bw.readLine()) != null) {
String[] CSVdate = thisLine.split(thisaplit,3);//建立矩陣欄位為3,以","做資料分隔
datalist.add(new DataModel(CSVdate[0],CSVdate[1],CSVdate[2]));//將資料放入ArrayList
}
mainAdapter.notifyDataSetChanged();
bw.close();
}catch(Exception e){
Log.d("ExceptionError","==" + e.getMessage());
e.printStackTrace();
}
點擊RecyclerView輸入資料
新增OnItemClickListener的interface
public interface OnItemClickListener {
void onItemClick(RecyclerView parent, View view, int position);
}
並在Adapter中加入
private OnItemClickListener mOnItemClickListener = null;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.mOnItemClickListener = onItemClickListener;
}
在Adapter加入implements View.OnClickListener
public class MainAdapter extends RecyclerView.Adapter<ViewHolder> implements View.OnClickListener
加入methods
public void onClick(View view) {
int position = recycler.getChildAdapterPosition(view);
if (mOnItemClickListener!=null){
mOnItemClickListener.onItemClick(recycler,view,position);
}
}
在ViewHolder onCreateViewHolder補上
view.setOnClickListener(this);
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.recycle_item,parent,false);
ViewHolder holder = new ViewHolder(view);
view.setOnClickListener(this);
return holder;
}
點擊RecyclerView使用自訂AlertDialog輸入
mainAdapter.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(RecyclerView parent, View view, int position) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(
MainActivity.this);
View v = getLayoutInflater()
.inflate(R.layout.set_dialog_layout,null);
Button btn_ok = v.findViewById(R.id.button_ok);
Button btn_cancal = v.findViewById(R.id.buttonCancel);
TextView titleName = v.findViewById(R.id.titleName);
EditText editTextInput = v.findViewById(R.id.editTextInput);
titleName.setText(datalist.get(position).getName());
alertDialog.setView(v);
alertDialog.setCancelable(false); //禁用返回
AlertDialog dialog = alertDialog.create();
dialog.show();
btn_ok.setOnClickListener(view1 -> {
if(editTextInput.length()!=0)
{
datalist.set(position , new DataModel(
datalist.get(position).getID(),
datalist.get(position).getName(),
editTextInput.getText().toString()));//更改list
mainAdapter.notifyDataSetChanged();//adapter更新
dialog.dismiss();
}
});
btn_cancal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view2) {
dialog.cancel();
}
});
}
});
寫入CSV
try {
final StringBuilder sb = new StringBuilder();
File storage = Environment.getExternalStorageDirectory();
File file = new File(storage + "/TXT" , "TXT.csv");
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream os = new FileOutputStream(file, false);//(檔案,是否接續寫入)
for (int i = 0; i < datalist.size(); i++) {
List<String> array = new ArrayList<>();//一行欄位
array.add(datalist.get(i).getID());
array.add(datalist.get(i).getName());
array.add(datalist.get(i).getScore());
for (int j = 0; j < array.size(); j++) {
sb.append(array.get(j));
if (j < array.size() - 1) {
sb.append(",");
} else {
sb.append("\n");
}
}
}
os.write(sb.toString().getBytes("UTF-8"));//將資料以UTF-8型態寫入
os.flush();
os.close();
}catch(Exception e){
Log.d("ExceptionError","==" + e.getMessage());
e.printStackTrace();
}
留言
張貼留言