By GokiSoft.com|
19:34 07/12/2020|
Android
[Video] Hướng dẫn tạo Food App bằng ListView + BaseAdapter - Lập trình android
Full Source Code - Food Application - Lap Trinh Android
#AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gokisoft.c1812l">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity" />
<activity android:name=".LoginActivity"></activity>
<activity android:name=".RegisterActivity" />
<activity android:name=".FruitActivity">
</activity>
<activity android:name=".FoodActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
#FoodAdapter.java
package com.gokisoft.c1812l.adapters;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.gokisoft.c1812l.R;
import com.gokisoft.c1812l.models.Food;
import java.util.List;
/**
* Created by Diep.Tran on 11/27/20.
*/
public class FoodAdapter extends BaseAdapter {
Activity activity;
List<Food> dataList;
public FoodAdapter(Activity activity, List<Food> dataList) {
this.activity = activity;
this.dataList = dataList;
}
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int i) {
return dataList.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
LayoutInflater inflater = activity.getLayoutInflater();
view = inflater.inflate(R.layout.item_food, null);
ImageView thumbnail = view.findViewById(R.id.ifo_thumbnail);
TextView title = view.findViewById(R.id.ifo_title);
TextView content = view.findViewById(R.id.ifo_content);
TextView price = view.findViewById(R.id.ifo_price);
Food food = dataList.get(position);
thumbnail.setImageResource(food.getResId());
title.setText(food.getTitle());
content.setText(food.getContent());
price.setText(String.valueOf(food.getPrice()));
return view;
}
}
#Food.java
package com.gokisoft.c1812l.models;
/**
* Created by Diep.Tran on 11/27/20.
*/
public class Food {
int resId;
String title, content;
float price;
public Food(int resId) {
this.resId = resId;
}
public Food(int resId, String title, String content, float price) {
this.resId = resId;
this.title = title;
this.content = content;
this.price = price;
}
public int getResId() {
return resId;
}
public void setResId(int resId) {
this.resId = resId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
#FoodActivity.java
package com.gokisoft.c1812l;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import com.gokisoft.c1812l.adapters.FoodAdapter;
import com.gokisoft.c1812l.models.Food;
import java.util.ArrayList;
import java.util.List;
public class FoodActivity extends AppCompatActivity {
ListView listView;
List<Food> dataList = new ArrayList<>();
FoodAdapter foodAdapter;
int currentIndex = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_food);
listView = findViewById(R.id.afo_listview);
//fake data
dataList.add(new Food(R.drawable.food01, "Pizza 01", "Ok Ngon 01", 100000));
dataList.add(new Food(R.drawable.food02, "Pizza 02", "Ok Ngon 02", 120000));
dataList.add(new Food(R.drawable.food03, "Pizza 03", "Ok Ngon 03", 160000));
//create adapter
foodAdapter = new FoodAdapter(this, dataList);
listView.setAdapter(foodAdapter);
//dang ky context menu
registerForContextMenu(listView);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_content, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int index = info.position;
switch (item.getItemId()) {
case R.id.menu_edit_item:
//Them item moi
this.currentIndex = index;
showDialogAdd();
return true;
case R.id.menu_delete_item:
dataList.remove(index);
foodAdapter.notifyDataSetChanged();
return true;
default:
return super.onContextItemSelected(item);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.menu_add_new_item:
//Them item moi
showDialogAdd();
return true;
case R.id.menu_exit:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void showDialogAdd() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.dialog_food, null);
final EditText edTitle = view.findViewById(R.id.df_title);
final EditText edContent = view.findViewById(R.id.df_content);
final EditText edPrice = view.findViewById(R.id.df_price);
if(currentIndex >= 0) {
edTitle.setText(dataList.get(currentIndex).getTitle());
edContent.setText(dataList.get(currentIndex).getContent());
edPrice.setText(String.valueOf(dataList.get(currentIndex).getPrice()));
}
builder.setView(view);
builder.setTitle("Add/Update Item")
.setPositiveButton("Save Item", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String title = edTitle.getText().toString();
String content = edContent.getText().toString();
float price = Float.parseFloat(edPrice.getText().toString());
if(currentIndex >= 0) {
dataList.get(currentIndex).setTitle(title);
dataList.get(currentIndex).setContent(content);
dataList.get(currentIndex).setPrice(price);
currentIndex = -1;
} else {
Food food = new Food(R.drawable.food01, title, content, price);
dataList.add(food);
}
foodAdapter.notifyDataSetChanged();
}
}).setNegativeButton("Cencel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.show();
}
}
#menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_add_new_item"
android:title="Add new item"/>
<item android:id="@+id/menu_exit"
android:title="Exit" />
</menu>
#menu_content.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_edit_item"
android:title="Edit item"/>
<item android:id="@+id/menu_delete_item"
android:title="Delete item" />
</menu>
#item_food.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/ifo_thumbnail"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_weight="1"
android:src="@drawable/food01" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/ifo_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
<TextView
android:id="@+id/ifo_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
<TextView
android:id="@+id/ifo_price"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
</LinearLayout>
#dialog_food.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<EditText
android:id="@+id/df_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="Name" />
<EditText
android:id="@+id/df_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textMultiLine" />
<EditText
android:id="@+id/df_price"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="numberDecimal" />
</LinearLayout>
#activity_food.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp"
tools:context="com.gokisoft.c1812l.FoodActivity">
<ListView
android:id="@+id/afo_listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Tags:
Phản hồi từ học viên
5
(Dựa trên đánh giá ngày hôm nay)
TRẦN VĂN ĐIỆP
2020-11-30 12:58:57
package com.gokisoft.c1812l;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import com.gokisoft.c1812l.adapters.FoodAdapter;
import com.gokisoft.c1812l.models.Food;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class FoodActivity extends AppCompatActivity {
ListView listView;
List<Food> dataList = new ArrayList<>();
FoodAdapter foodAdapter;
int currentIndex = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_food);
listView = findViewById(R.id.afo_listview);
// //fake data
// dataList.add(new Food(R.drawable.food01, "Pizza 01", "Ok Ngon 01", 100000));
// dataList.add(new Food(R.drawable.food02, "Pizza 02", "Ok Ngon 02", 120000));
// dataList.add(new Food(R.drawable.food03, "Pizza 03", "Ok Ngon 03", 160000));
// readFile();
readSharedPreferences();
//create adapter
foodAdapter = new FoodAdapter(this, dataList);
listView.setAdapter(foodAdapter);
//dang ky context menu
registerForContextMenu(listView);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_content, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int index = info.position;
switch (item.getItemId()) {
case R.id.menu_edit_item:
//Them item moi
this.currentIndex = index;
showDialogAdd();
return true;
case R.id.menu_delete_item:
dataList.remove(index);
foodAdapter.notifyDataSetChanged();
return true;
default:
return super.onContextItemSelected(item);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.menu_add_new_item:
//Them item moi
showDialogAdd();
return true;
case R.id.menu_exit:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void readFile() {
//code save File o day
ObjectInputStream ois = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(getFileStreamPath("food.dat"));
ois = new ObjectInputStream(fis);
//save file
dataList = (List<Food>) ois.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if(ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void saveFile() {
//code save File o day
ObjectOutputStream oos = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(getFileStreamPath("food.dat"));
oos = new ObjectOutputStream(fos);
//save file
oos.writeObject(dataList);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void saveSharedPreferences() {
//Save dataList => Object Array => convert Object Array => String (json string)
//Su dung thu vien gson => convert object/array => json string va nguoc lai
String json = new Gson().toJson(dataList);
//save json to SharedPreferences
SharedPreferences sharedPreferences = getSharedPreferences("C1808G", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
//save
editor.putString("dataList", json);
editor.commit();
}
private void readSharedPreferences() {
SharedPreferences sharedPreferences = getSharedPreferences("C1808G", MODE_PRIVATE);
String json = sharedPreferences.getString("dataList", "[]");
//convert json string => object array
Gson gson = new Gson();
dataList = gson.fromJson(json, new TypeToken<List<Food>>(){}.getType());
if(dataList == null) {
dataList = new ArrayList<>();
}
}
private void showDialogAdd() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.dialog_food, null);
final EditText edTitle = view.findViewById(R.id.df_title);
final EditText edContent = view.findViewById(R.id.df_content);
final EditText edPrice = view.findViewById(R.id.df_price);
if(currentIndex >= 0) {
edTitle.setText(dataList.get(currentIndex).getTitle());
edContent.setText(dataList.get(currentIndex).getContent());
edPrice.setText(String.valueOf(dataList.get(currentIndex).getPrice()));
}
builder.setView(view);
builder.setTitle("Add/Update Item")
.setPositiveButton("Save Item", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String title = edTitle.getText().toString();
String content = edContent.getText().toString();
float price = Float.parseFloat(edPrice.getText().toString());
if(currentIndex >= 0) {
dataList.get(currentIndex).setTitle(title);
dataList.get(currentIndex).setContent(content);
dataList.get(currentIndex).setPrice(price);
currentIndex = -1;
} else {
Food food = new Food(R.drawable.food01, title, content, price);
dataList.add(food);
}
// saveFile();
saveSharedPreferences();
foodAdapter.notifyDataSetChanged();
}
}).setNegativeButton("Cencel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.show();
}
}