RecyclerView的使用方法
标签: android
在使用recylerView的时候,我一直感觉这个控件使用起来比较复杂,所以要总结一下有关于这个控件的相关的知识,其实只要好好剖析一下安卓中有关于控件的知识会发现还是比较容易使用的。
1.添加依赖关系
首先,根据我个人的经验来感觉的话,如果要使用一个控件,首先要看这个控件是否存在于相关的包中,如果不存在的化就要在依赖中使用这个包,对于recyclerView也是一样的,首先要在和android项目中的app目录下的build.grandle文件里面添加相关的依赖关系:
compile 'com.android.support:recyclerview-v7:26.1.0'
其中依赖关系后面的数字代表使用的版本号,根据具体的使用可以进行调整。
2.在布局文件也就是相关的xml文件中使用recyclerView的控件,然后设置它的相关的属性,具体的属性和其它的ui控件差不多。相关的实例:
<android.support.v7.widget.RecyclerView
app:layout_constraintTop_toBottomOf="@id/divideLine"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_margin="@dimen/viewMargin"
android:id="@+id/person_recyclerView"
android:layout_width="match_parent"
android:layout_height="360dp">
</android.support.v7.widget.RecyclerView>
3.定义recylerView控件的内部条目的样式,这里就可以有各种多样的设置了,自己可以自己定义相关的控件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="60dp">
<TextView
android:id="@+id/item_name_main"
android:layout_margin="@dimen/viewMargin"
android:textSize="@dimen/textSize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名"
android:layout_gravity="center"
android:gravity="center"/>
<TextView
android:id="@+id/item_birthday_main"
android:layout_margin="@dimen/viewMargin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:layout_weight="1"
android:textSize="@dimen/textSize"
android:text="生日" />
<TextView
android:id="@+id/item_gift_main"
android:layout_margin="@dimen/viewMargin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/textSize"
android:text="礼物"
android:layout_gravity="center"
android:gravity="center"/>
</LinearLayout>
4.然后就是配置recyclerView的相关的适配器了,配置的方法也是很简单的主要是实现RecyclerView.Adapter类,然后重载其中的onCreateViewHolder,onBindViewHolder,getItemCount方法,然后因为其中要用到ViewHolder所以要写一个ViewHolder的类用来存放临时的数据,其中每一个viewHolde就是recyclerView中的一个条目。相关的代码如下:
package com.example.dell_gxr.week10;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
/**
* Created by dell_gxr on 2017/12/7.
*/
public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.PersonViewHolder> {
private List<Person> mList;
private PersonDatabase mDBHelper;
@Override
public PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.main_item, parent, false);
final PersonViewHolder holder = new PersonViewHolder(view);
final int position = holder.getAdapterPosition();
Log.d("PersonAdapter","on create number: " + Integer.toString(position));
return holder;
}
@Override
public void onBindViewHolder(PersonViewHolder holder, @SuppressLint("RecyclerView") final int position) {
Log.d("PersonAdapter","on bind number: " + Integer.toString(position));
Person current = mList.get(position);
holder.name.setText(current.getName());
holder.birthday.setText(current.getBirthday());
holder.gift.setText(current.getGift());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final View view1 = LayoutInflater.from(v.getContext())
.inflate(R.layout.modify_dialog, null);
TextView textView1 = view1.findViewById(R.id.modify_dialog_name_textView);
TextView textView2 = view1.findViewById(R.id.modify_dialog_number_textView);
textView1.setText("姓名:" + mList.get(position).getName());
textView2.setText("手机号码:" + mList.get(position).getNumber());
EditText editText1 = view1.findViewById(R.id.modify_dialog_birthday_EditText);
EditText editText2 = view1.findViewById(R.id.modify_dialog_gift_EditText);
editText1.setText(mList.get(position).getBirthday());
editText2.setText(mList.get(position).getGift());
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
builder.setTitle("快乐每天!");
builder.setView(view1);
builder.setCancelable(true);
builder.setPositiveButton("保存修改", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
EditText editText1 = view1.findViewById(R.id.modify_dialog_birthday_EditText);
EditText editText2 = view1.findViewById(R.id.modify_dialog_gift_EditText);
if(TextUtils.isEmpty(editText1.getText().toString())) {
mList.get(position).setBirthday("");
} else {
mList.get(position).setBirthday(editText1.getText().toString());
}
if(TextUtils.isEmpty(editText2.getText().toString())) {
mList.get(position).setGift("");
} else {
mList.get(position).setGift(editText2.getText().toString());
}
notifyDataSetChanged();
Toast.makeText(view1.getContext(), "修改成功", Toast.LENGTH_SHORT).show();
mDBHelper.update(mList.get(position));
}
});
builder.setNegativeButton("放弃修改", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.show();
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(final View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
builder.setTitle("是否删除?");
builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mDBHelper.delete(mList.get(position));
mList.remove(position);
notifyDataSetChanged();
Toast.makeText(v.getContext(), "成功删除", Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(v.getContext(), "取消删除", Toast.LENGTH_SHORT).show();
}
});
builder.show();
return false;
}
});
}
@Override
public int getItemCount() {
return mList.size();
}
PersonAdapter(List<Person> tList, PersonDatabase dbHelper) {
super();
mList = tList;
mDBHelper = dbHelper;
}
class PersonViewHolder extends RecyclerView.ViewHolder {
TextView name;
TextView birthday;
TextView gift;
public PersonViewHolder(View itemView) {
super(itemView);
name = itemView.findViewById(R.id.item_name_main);
birthday = itemView.findViewById(R.id.item_birthday_main);
gift = itemView.findViewById(R.id.item_gift_main);
}
}
}
5.最后就是在主活动为相应的recyclerView使用这个适配器了,注意要在使用适配器的过程中设置相应的Layout,这样才能使得recylerView正常显示:
public void initItem() {
RecyclerView recyclerView = findViewById(R.id.person_recyclerView);
PersonAdapter personAdapter = new PersonAdapter(allList, dbHelper);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(personAdapter);
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
}