[英]Getting an error when i try to pass data from sqlite to new activity throw recyclerview (Android)
[英]I want to make a recyclerview that shows data to a new Activity from SQLITE database
我正在做一個項目,我有一個包含 id、標題、內容的 sqlite 數據庫能夠從數據庫中讀取內容。 希望我的問題很清楚! 謝謝你。
這是我的 DatabaseHelper 類
數據庫助手
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DBNAME = "alQais.db";
private Context context;
private SQLiteDatabase sqLiteDatabase;
public DatabaseHelper(Context mContext){
super(mContext, DBNAME, null, 1);
this.context = mContext;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void openDatabase(){
String dbPath = context.getDatabasePath(DBNAME).getPath();
if(sqLiteDatabase != null && sqLiteDatabase.isOpen()){
return;
}
sqLiteDatabase = SQLiteDatabase.openDatabase(dbPath, null,SQLiteDatabase.OPEN_READWRITE);
}
public void closeDatabase(){
if(sqLiteDatabase != null){
sqLiteDatabase.close();
}
}
public ArrayList getAllTitles(){
ArrayList arrayList = new ArrayList();
openDatabase();
Cursor cursor = sqLiteDatabase.rawQuery("select * from muallaqat", null);
cursor.moveToFirst();
while (!cursor.isAfterLast()){
arrayList.add(cursor.getString(cursor.getColumnIndex("title")));
cursor.moveToNext();
}
cursor.close();
closeDatabase();
return arrayList;
}
public String getMuallaqa(String title){
String muallaqat;
openDatabase();
Cursor cursor = sqLiteDatabase.rawQuery("select * from muallaqat where title like '" + title + "'", null);
cursor.moveToFirst();
muallaqat = cursor.getString(cursor.getColumnIndex("muallaqa"));
cursor.close();
closeDatabase();
return muallaqat;
}}
主活動.java
public class MainActivity extends AppCompatActivity {
DatabaseHelper db = new DatabaseHelper(this);
ListView listView;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
listView = findViewById(R.id.listView);
File database = getBaseContext().getDatabasePath(db.DBNAME);
if(false == database.exists()){
db.getReadableDatabase();
if(copyDatabase(this)){
Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT).show();
} else{
Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT).show();
return;
}
}
ArrayList lstTitles = db.getAllTitles();
ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.item_layout, lstTitles);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String title = String.valueOf(parent.getItemAtPosition(position));
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
intent.putExtra("title", title);
startActivity(intent);
}
});
}
private boolean copyDatabase(Context mContext){
try{
InputStream inputStream = mContext.getAssets().open(db.DBNAME);
String outFileName = db.DBLOCATION + db.DBNAME;
OutputStream outputStream = new FileOutputStream(outFileName);
byte[] buff = new byte[1024];
int length = 0;
while ((length = inputStream.read(buff)) > 0){
outputStream.write(buff, 0, length);
}
outputStream.flush();
outputStream.close();
return true;
}catch (Exception e){
return false;
}
}}
這是顯示來自 sqlite 的內容的活動
Main2Activity.java
public class Main2Activity extends AppCompatActivity {
DatabaseHelper db = new DatabaseHelper(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Typeface face = Typeface.createFromAsset(getAssets(), "font/Amiri-Regular.ttf");
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
final TextView muallaqa = findViewById(R.id.muallaqa);
muallaqa.setMovementMethod(new ScrollingMovementMethod());
muallaqa.setTypeface(face);
Intent intent = getIntent();
String title = intent.getStringExtra("title");
String fullMuallaqa = db.getMuallaqa(title);
muallaqa.setText(fullMuallaqa);
this.setTitle(title);
}}
參考步驟
1)例如為id、title、content創建setter和getter方法
public class settter
{
int id;
String name;
String content;
public 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;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
2)在xml mainactivity中添加recyclerview
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
3)在 MainActivity 中刪除所有 listview 相關代碼並添加下面給出的代碼
RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recycler_view2);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//make array list object with setter class
ArrayList<setter> name =db.getAllTitles();
//new adapter(ArrayList<setter>, context) ,so initiate adapter
recyclerView.setAdapter(new adapter(name,getApplicationContext()));
//draw line
recyclerView.addItemDecoration(new
DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
4) 創建布局文件來保存您的數據並在 recyclerview 內膨脹
名稱:recycler_content_holder.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/recycler_content_holder"
>
<TextView
android:layout_width="50dp"
android:layout_height="match_parent"
android:gravity="center"
android:id="@+id/tv_id"/>
<TextView
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_marginLeft="30dp"
android:id="@+id/tv_title"
android:gravity="center"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="30dp"
android:gravity="center|right"
android:id="@+id/tv_content"/>
</LinearLayout>
5)創建適配器類
public class adapter extends RecyclerView.Adapter<adapter.AdapterViewHolder>
{
ArrayList<settter> data;
Context context;
public adapter(ArrayList<settter> data,Context context)
{
this.data=data;
this.context=context;
}
@NonNull
@Override
public AdapterViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i)
{
LayoutInflater layoutInflater=LayoutInflater.from(viewGroup.getContext());
View view=layoutInflater.inflate(R.recycler_content_holder,viewGroup,false);
return new ProgramingViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i)
{
viewHolder.id.setText(""+data.get(i).getId());
viewHolder.title.setText(data.get(i).getTitle());
viewHolder.content.setText(data.get(i).getContent());
viewHolder.linearLayout.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
String title = String.valueOf(data.get(i).getTitle());
Intent intent = new Intent(context, Main2Activity.class);
intent.putExtra("title", title);
startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return data.size();
}
//class programingViewHolder
public class AdapterViewHolder extends RecyclerView.ViewHolder
{
TextView id,title,content;
LinearLayout linearLayout;
public AdapterViewHolder(@NonNull View itemView) {
super(itemView);
id=(TextView)itemView.findViewById(R.id.tv_id);
title=(TextView)itemView.findViewById(R.id.tv_mtrNo);
content=(TextView)itemView.findViewById(R.id.tv_nm);
linearLayout=(LinearLayout)itemView.findViewById(R.id.recycler_content_holder);
}
}
}
6)DatabaseHelper中的更改方法
public ArrayList<setter> getAllTitles(){
ArrayList<setter> arrayList = new ArrayList();
openDatabase();
setter set=new setter();
Cursor cursor = sqLiteDatabase.rawQuery("select * from muallaqat", null);
cursor.moveToFirst();
while (!cursor.isAfterLast()){
set.setTitle(cursor.getString(cursor.getColumnIndex("title")));
//add object to arralist
arrayList.add(set);
cursor.moveToNext();
}
cursor.close();
closeDatabase();
return arrayList;
}
只需復制,粘貼和理解,我希望它會幫助你。
如果我理解正確,您想對來自 SQLite 數據庫的數據使用 recyclerview 嗎? 並且您想在單擊某個項目時打開一個新活動並使用該項目的數據填充它? 看看這篇文章
只需做一件事,從數據庫中獲取 id 和標題並在 recyclerview 中顯示標題。 並且當 recyclerview 上的 onItemClick 將特定位置的 id 傳遞給下一個活動。
並在下一個活動中獲取從上一個活動傳遞的 ID。
並從帶有 id 的數據中獲取數據。 您將獲得所有數據。
並將獲取的數據顯示到活動中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.