簡體   English   中英

我想制作一個 recyclerview 來顯示來自 SQLITE 數據庫的新活動的數據

[英]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 嗎? 並且您想在單擊某個項目時打開一個新活動並使用該項目的數據填充它? 看看這篇文章

RecyclerView 與 Cursor Adapter 的實現

只需做一件事,從數據庫中獲取 id 和標題並在 recyclerview 中顯示標題。 並且當 recyclerview 上的 onItemClick 將特定位置的 id 傳遞給下一個活動。

並在下一個活動中獲取從上一個活動傳遞的 ID。

並從帶有 id 的數據中獲取數據。 您將獲得所有數據。

並將獲取的數據顯示到活動中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM