有趣的Android编程(2)备忘录小实例之二(用了litepal与recyclerview)(完结篇)

上篇介绍了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();
                }
            }
        });
    }
}

//到这里就是全部的代码讲解啦,博主感觉应该是挺全面的把。但有可能也有一些小问题或者小知识点,大家不知道但博主没有讲到的,关于代码问题也可以私信博主或评论。这次的代码讲解博主放在代码里了,而不是像上次一样打字的,感觉还是放在代码里比较容易懂把。

//如果代码有问题,或者对这个小实例有不懂的可以私信或留言的。博主会实时关注的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值