Androidのデータベースでrecyclerviewを使用するにはどうすればよいですか?
この例は、Androidのデータベースでrecyclerviewを使用する方法を示しています。
ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。
build.gradle(モジュール:app)に次の依存関係を追加します
implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.android.support:design:28.0.0'
ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="4dp" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:layout_marginBottom="50dp" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="8dp" android:id="@+id/myContactList" /> <Button android:id="@+id/btnAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_marginEnd="16dp" android:text="ADD" android:padding="2dp" android:layout_marginBottom="4dp"/> </FrameLayout>
ステップ3 −以下のようにレイアウトリソースファイルを作成し、それぞれのコードを追加します-
add_contacts.xml −
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/enterName" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter Name" android:textSize="12dp" android:inputType="text" android:maxLines="1" android:layout_marginEnd="8dp" android:padding="12dp"/> <EditText android:id="@+id/enterPhoneNum" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter Number" android:layout_marginTop="10dp" android:textSize="12sp" android:inputType="phone" android:maxLines="1" android:layout_marginEnd="8dp" android:padding="12dp"/> </LinearLayout>
contact_list_layout.xml −
<?xml version="1.0" encoding="utf-8"?> <androidx.cardview.widget.CardView xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="1dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="12dp"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/contactName" android:layout_width="220dp" android:layout_height="wrap_content" android:textSize="12sp" android:textStyle="bold" /> <TextView android:layout_below="@+id/contactName" android:id="@+id/phoneNum" android:layout_width="220dp" android:layout_height="wrap_content" android:textSize="12sp" android:textStyle="bold" /> </RelativeLayout> <ImageView android:id="@+id/editContact" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:src="@drawable/ic_edit" android:contentDescription="TODO" /> <ImageView android:id="@+id/deleteContact" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" android:src="@drawable/ic_remove" android:contentDescription="TODO" /> </LinearLayout> </androidx.cardview.widget.CardView>
ステップ4 − Javaクラスを作成し、次のコードをContactAdapter.java
に追加します。import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.Filter; import android.widget.Filterable; import android.widget.Toast; import java.util.ArrayList; import java.util.Objects; import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; class ContactAdapter extends RecyclerView.Adapter<ContactViewHolder> implements Filterable { private Context context; private ArrayList<Contacts> listContacts; private ArrayList<Contacts> mArrayList; private SqliteDatabase mDatabase; ContactAdapter(Context context, ArrayList<Contacts> listContacts) { this.context = context; this.listContacts = listContacts; this.mArrayList = listContacts; mDatabase = new SqliteDatabase(context); } @Override public ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contact_list_layout, parent, false); return new ContactViewHolder(view); } @Override public void onBindViewHolder(ContactViewHolder holder, int position) { final Contacts contacts = listContacts.get(position); holder.tvName.setText(contacts.getName()); holder.tvPhoneNum.setText(contacts.getPhno()); holder.editContact.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { editTaskDialog(contacts); } }); holder.deleteContact.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mDatabase.deleteContact(contacts.getId()); ((Activity) context).finish(); context.startActivity(((Activity) context).getIntent()); } }); } @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence charSequence) { String charString = charSequence.toString(); if (charString.isEmpty()) { listContacts = mArrayList; } else { ArrayList<Contacts> filteredList = new ArrayList<>(); for (Contacts contacts : mArrayList) { if (contacts.getName().toLowerCase().contains(charString)) { filteredList.add(contacts); } } listContacts = filteredList; } FilterResults filterResults = new FilterResults(); filterResults.values = listContacts; return filterResults; } @Override protected void publishResults(CharSequence charSequence, FilterResults filterResults) { listContacts = (ArrayList<Contacts>) filterResults.values; notifyDataSetChanged(); } }; } @Override public int getItemCount() { return listContacts.size(); } private void editTaskDialog(final Contacts contacts) { LayoutInflater inflater = LayoutInflater.from(context); View subView = inflater.inflate(R.layout.add_contacts, null); final EditText nameField = subView.findViewById(R.id.enterName); final EditText contactField = subView.findViewById(R.id.enterPhoneNum); if (contacts != null) { nameField.setText(contacts.getName()); contactField.setText(String.valueOf(contacts.getPhno())); } AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Edit contact"); builder.setView(subView); builder.create(); builder.setPositiveButton("EDIT CONTACT", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { final String name = nameField.getText().toString(); final String ph_no = contactField.getText().toString(); if (TextUtils.isEmpty(name)) { Toast.makeText(context, "Something went wrong. Check your input values", Toast.LENGTH_LONG).show(); } else { mDatabase.updateContacts(new Contacts(Objects.requireNonNull(contacts).getId(), name, ph_no)); ((Activity) context).finish(); context.startActivity(((Activity) context).getIntent()); } } }); builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(context, "Task cancelled",Toast.LENGTH_LONG).show(); } }); builder.show(); } }
ステップ5 − javaクラスを作成し、次のコードをContacts.java
に追加します。public class Contacts { private int id; private String name; private String phoneNumber; Contacts(String name, String phno) { this.name = name; this.phoneNumber = phno; } Contacts(int id, String name, String phno) { this.id = id; this.name = name; this.phoneNumber = phno; } int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } String getPhno() { return phoneNumber; } public void setPhno(String phno) { this.phoneNumber = phno; } }
ステップ6 − Javaクラスを作成し、次のコードをContactViewHolder.java
に追加します。import android.view.View; import android.widget.ImageView; import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; class ContactViewHolder extends RecyclerView.ViewHolder { TextView tvName, tvPhoneNum; ImageView deleteContact; ImageView editContact; ContactViewHolder(View itemView) { super(itemView); tvName = itemView.findViewById(R.id.contactName); tvPhoneNum = itemView.findViewById(R.id.phoneNum); deleteContact = itemView.findViewById(R.id.deleteContact); editContact = itemView.findViewById(R.id.editContact); } }
ステップ7 − Javaクラスを作成し、次のコードをSqliteDatabase.java
に追加します。import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import java.util.ArrayList; public class SqliteDatabase extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 5; private static final String DATABASE_NAME = "Contacts"; private static final String TABLE_CONTACTS = "Contacts"; private static final String COLUMN_ID = "_id"; private static final String COLUMN_NAME = "contactName"; private static final String COLUMN_NO = "phoneNumber"; SqliteDatabase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_NAME + " TEXT," + COLUMN_NO + " INTEGER" + ")"; db.execSQL(CREATE_CONTACTS_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); onCreate(db); } ArrayList<Contacts> listContacts() { String sql = "select * from " + TABLE_CONTACTS; SQLiteDatabase db = this.getReadableDatabase(); ArrayList<Contacts> storeContacts = new ArrayList<>(); Cursor cursor = db.rawQuery(sql, null); if (cursor.moveToFirst()) { do { int id = Integer.parseInt(cursor.getString(0)); String name = cursor.getString(1); String phno = cursor.getString(2); storeContacts.add(new Contacts(id, name, phno)); } while (cursor.moveToNext()); } cursor.close(); return storeContacts; } void addContacts(Contacts contacts) { ContentValues values = new ContentValues(); values.put(COLUMN_NAME, contacts.getName()); values.put(COLUMN_NO, contacts.getPhno()); SQLiteDatabase db = this.getWritableDatabase(); db.insert(TABLE_CONTACTS, null, values); } void updateContacts(Contacts contacts) { ContentValues values = new ContentValues(); values.put(COLUMN_NAME, contacts.getName()); values.put(COLUMN_NO, contacts.getPhno()); SQLiteDatabase db = this.getWritableDatabase(); db.update(TABLE_CONTACTS, values, COLUMN_ID + " = ?", new String[]{String.valueOf(contacts.getId())}); } void deleteContact(int id) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_CONTACTS, COLUMN_ID + " = ?", new String[]{String.valueOf(id)}); } }
ステップ8 −次のコードをsrc / MainActivity.java
に追加しますimport androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.content.DialogInterface; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private SqliteDatabase mDatabase; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView contactView = findViewById(R.id.myContactList); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); contactView.setLayoutManager(linearLayoutManager); contactView.setHasFixedSize(true); mDatabase = new SqliteDatabase(this); ArrayList<Contacts> allContacts = mDatabase.listContacts(); if (allContacts.size() > 0) { contactView.setVisibility(View.VISIBLE); ContactAdapter mAdapter = new ContactAdapter(this, allContacts); contactView.setAdapter(mAdapter); } else { contactView.setVisibility(View.GONE); Toast.makeText(this, "There is no contact in the database. Start adding now", Toast.LENGTH_LONG).show(); } Button btnAdd = findViewById(R.id.btnAdd); btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { addTaskDialog(); } }); } private void addTaskDialog() { LayoutInflater inflater = LayoutInflater.from(this); View subView = inflater.inflate(R.layout.add_contacts, null); final EditText nameField = subView.findViewById(R.id.enterName); final EditText noField = subView.findViewById(R.id.enterPhoneNum); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Add new CONTACT"); builder.setView(subView); builder.create(); builder.setPositiveButton("ADD CONTACT", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { final String name = nameField.getText().toString(); final String ph_no = noField.getText().toString(); if (TextUtils.isEmpty(name)) { Toast.makeText(MainActivity.this, "Something went wrong. Check your input values", Toast.LENGTH_LONG).show(); } else { Contacts newContact = new Contacts(name, ph_no); mDatabase.addContacts(newContact); finish(); startActivity(getIntent()); } } }); builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity.this, "Task cancelled", Toast.LENGTH_LONG).show(); } }); builder.show(); } @Override protected void onDestroy() { super.onDestroy(); if (mDatabase != null) { mDatabase.close(); } } }
ステップ9 −次のコードをandroidManifest.xmlに追加します
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample"> <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"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
アプリケーションを実行してみましょう。実際のAndroidモバイルデバイスをコンピューターに接続していると思います。 Android Studioからアプリを実行するには、プロジェクトのアクティビティファイルの1つを開き、ツールバーの[実行]アイコンをクリックします。オプションとしてモバイルデバイスを選択し、デフォルトの画面を表示するモバイルデバイスを確認します-
-
AndroidアプリケーションでSQLiteデータベースを使用するにはどうすればよいですか?
この例は、AndroidアプリケーションでSQLiteデータベースを使用する方法を示しています。 ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。 ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="
-
AndroidでRecyclerViewを使用して無限のリストを実装するにはどうすればよいですか?
この例は、AndroidでRecyclerViewを使用してエンドレスリストを実装する方法を示しています。 ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。 ビルドgradle(モジュールアプリ)に次の依存関係を追加します- implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.android.support:recyclervie