上篇介绍了litepal的创建,这篇就来介绍关于recyclerview的创建与页面代码的编写把。
recyclerview也是得添加依赖的,不要忘啦。
implementation 'androidx.recyclerview:recyclerview:1.1.0-rc01'
关于主页面,这里比较简洁,就只有一个创建按钮,下面就是recyclerview列表了。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/createButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
关于recyclerview绑定的页面(就是recyclerview每一行显示的内容),比较简洁只有一个textview来显示名称
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/recycler_text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
还有就是点列表中的一个和点击创建按钮所进去的页面。(用的是同一个页面,只不过点创建进去没有数据而已)也很简单,只有两个按钮一个完成一个删除。剩下的就是显示名称和正文的EditText啦。
//这里对一些属性进行解释一下把,android:orientation="vertical",这个很简单就是是线性布局竖着排列。 android:layout_marginLeft="100dp",这个是左边的边距为100dp, android:background="@null"这个是让EditText没有下划线。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/display_finish" android:layout_width="wrap_content" android:layout_marginLeft="100dp" android:layout_height="wrap_content" android:text="完成"/> <Button android:id="@+id/display_remove" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="50dp" android:text="删除"/> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/colorAccent"/> <EditText android:id="@+id/display_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null"/> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/colorAccent"/> <EditText android:id="@+id/display_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" /> </LinearLayout>
//这里面的View就是为了美观而弄的分界线而且,没有也可以,但是要用的话,兄弟们一定要是大写的V,不要用小写的,会出错的。
下面来说一下最关心的也是最重要的,就是recyclerview的适配器啦
package com.example.memorandum; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { Context mContext; List<data> list; //mContext,就是引用适配器页面的Activity。list就是列表中要是显示的集合。 public MyAdapter(Context mContext,List<data> list) { this.mContext=mContext; this.list=list; } public class ViewHolder extends RecyclerView.ViewHolder { //绑定recyclerview布局里面的控件,这里只有显示名字的textview TextView textView; public ViewHolder(@NonNull View itemView) { super(itemView); textView=itemView.findViewById(R.id.recycler_text); } } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //新建view,第一个参数为Context,添之前传进来的就行,第二个为传绑定的layout, //格式为R.alyout.layout的名,这里的名字是layout文件夹里的名字,去掉.xml之后的,第三个添null就可以了 View view=View.inflate(mContext,R.layout.recyclerview,null); ViewHolder viewHolder=new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { //绑定数据 final data d = list.get(position); holder.textView.setText(d.getName()); //设置textview 的点击事件 holder.textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /* * 这里面用到了Intent来传输数据,只要调用intent的putExtra方法就可以了, * 里面的参数,第一个为数据的key,说白了就是为这个数据定义一个名字,取的时候需要 * 第二个为那个数据,如果是自己定义的类的话,必须继承Serializable才可以。 * Context就可以调用startActivity方法来实现跳转的功能,而要想关闭当前页面,还必须得把它强转为Activity * 才可以调用finish()方法,来关闭页面。 * */ Intent intent=new Intent(mContext,dispaly.class); intent.putExtra("name",d); mContext.startActivity(intent); Activity main=(Activity)mContext; main.finish(); } }); } //这个方法返回的是列表里面有多少项。返回list的长度就行啦 @Override public int getItemCount() { return list.size(); } }
然后就是关于主页面的编写啦。关litepal的问题下面有说的。
package com.example.memorandum; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Adapter; import android.widget.Button; import org.litepal.crud.DataSupport; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //定义与绑定控件 Button button=findViewById(R.id.createButton); RecyclerView recyclerView=findViewById(R.id.recyclerview); //定义布局管理,这个是必须的,如果要让recyclerview显示出来,必须得为他配置布局与适配器两个东西。 LinearLayoutManager manager = new LinearLayoutManager(this); //定义适配器 MyAdapter adapter=new MyAdapter(this, DataSupport.findAll(data.class)); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(manager); //定义创建按钮得点击事件 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Intent的第一个参数是当前页面,第二个为跳转后的页面 Intent intent=new Intent(MainActivity.this,dispaly.class); startActivity(intent); //关闭当前页面 finish(); } }); } }
关于显示列表中数据的页面,这里面我们点击列表内数据和点击创建时一个页面,这里来解释一下litepal的用法把,向上一个博客那样定义完之后,我们定义了一个id,但我们并不用给他赋值,赋值也是给不上的,在创建对象时,会自动给赋值一个id,还是唯一标识符,我们更新数据靠的就是它。下面说一下litepal的增删改查方法把。
增加:新建一个类,用set来赋值,最后save即可。
data d2=new data(); d2.setContent(content.getText().toString()); d2.setName(name.getText().toString()); d2.save();
删除:直接调用DataSupport的方法即可。第一个参数为删除的类名.class,第二个,第三个参数为对删除对象的锁定。比如我们这里用的时"id=?"和id,就是说,删除id为d.getId()+""的项,用id来确认删除的对象。
String id=d.getId()+""; DataSupport.deleteAll(data.class,"id=?",id);
更改:先定义一个类的对象,然后用set赋值,最后调用方法updateAll,里面两个参数与删除的后两个时一样的。
String id=d.getId()+""; d.setContent(content.getText().toString()); d.setName(name.getText().toString()); d.updateAll("id=?",id);
查询:用DataSupport的findAll的方法来查询,里面的参数为类名加.class.
DataSupport.findAll(data.class)
下面是页面的代码:
package com.example.memorandum; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import org.litepal.crud.DataSupport; import java.util.List; public class dispaly extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dispaly); final Button finish=findViewById(R.id.display_finish); Button remove=findViewById(R.id.display_remove); final EditText name=findViewById(R.id.display_name); final EditText content=findViewById(R.id.display_content); //接收传进来的数据,如果通过创建点进来的话没数据 final data d=(data)getIntent().getSerializableExtra("name"); if(d!=null)//如果d不为null说明是点击列表进来的,有数据 { //改变控件的数据 name.setText(d.getName()); content.setText(d.getContent()); } //设置完成的点击事件。 finish.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(d!=null)//如果d不为null说明是点击列表进来的,更新数据库 { String id=d.getId()+""; d.setContent(content.getText().toString()); d.setName(name.getText().toString()); d.updateAll("id=?",id); Intent intent = new Intent(dispaly.this, MainActivity.class); startActivity(intent); finish(); } else //如果d为空的话,说明是点添加进来的,新加数据库 { if(!name.getText().toString().equals(""))//如果有名字才可以跳回列表 { data d2=new data(); d2.setContent(content.getText().toString()); d2.setName(name.getText().toString()); d2.save(); Intent intent = new Intent(dispaly.this, MainActivity.class); startActivity(intent); finish(); } } } }); //设置删除的点击事件。 remove.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(d!=null)//如果d不为null说明是点击列表进来的,删除数据库中数据。 { String id=d.getId()+""; DataSupport.deleteAll(data.class,"id=?",id); Intent intent = new Intent(dispaly.this, MainActivity.class); startActivity(intent); finish(); } else //如果d为空的话,说明是点添加进来的,只需要返回即可 { Intent intent = new Intent(dispaly.this, MainActivity.class); startActivity(intent); finish(); } } }); } }
//到这里就是全部的代码讲解啦,博主感觉应该是挺全面的把。但有可能也有一些小问题或者小知识点,大家不知道但博主没有讲到的,关于代码问题也可以私信博主或评论。这次的代码讲解博主放在代码里了,而不是像上次一样打字的,感觉还是放在代码里比较容易懂把。