RecyclerView是一种显示多条信息的控件,平时QQ,微信的聊天界面以及微博浏览信息的界面都是使用RecyclerView实现的。
本文使用的RecyclerView是使用的androidx包下的控件,因为之前的support包比较混乱,所以Android已经开始使用androidx包来取代。
1.RecyclerView配置
要使用RecyclerView需要自己配置,只需要在布局文件下切换至布局管理器就可以下载配置了。
点击RecyclerView旁边的下载按钮即可自动配置好,然后就可以进行使用了。
2.RecyclerView的使用
在布局文件中引用,完整的布局文件如下
`<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/account_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
然后写一个RecyclerView的适配器来填充数据,在此之前还需要写一个RecyclerView填充项目的布局文件和实体类。 项目布局文件:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TableRow>
<ImageView
android:id="@+id/app_icon"
/>
<TextView
android:id="@+id/app_name"
/>
</TableRow>
<TableRow>
<TextView
android:text="@string/account"
/>
<TextView
android:id="@+id/account"
/>
<TextView
android:text="@string/password"
/>
<TextView
android:id="@+id/password"
/>
</TableRow>
</TableLayout>
`
实体类:`public class AccountMessage {
private byte[] appIcon;
private String appName;
private String account;
private String password;
public AccountMessage(){}
public AccountMessage(byte[] appIcon, String appName, String account, String password) {
this.appIcon = appIcon;
this.appName = appName;
this.account = account;
this.password = password;
}
public byte[] getAppIcon() {
return appIcon;
}
public void setAppIcon(byte[] appIcon) {
this.appIcon = appIcon;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
适配器:适配器继承自RecyclerView的适配器类,使用ViewHolder来降低绑定布局的频率,提高RecyclerView的使用效率。适配器类如下:
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(MainActivity.this)
.inflate(R.layout.item_account, parent, false));
return holder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.appIconView.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher1));
holder.appNameTV.setText(mAccount.get(position).getAppName());
holder.accountTV.setText(mAccount.get(position).getAccount());
holder.passwordTV.setText(mAccount.get(position).getPassword());
}
@Override
public int getItemCount() {
return mAccount.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView appIconView;
TextView appNameTV;
TextView accountTV;
TextView passwordTV;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
appIconView = (ImageView) itemView.findViewById(R.id.app_icon);
appNameTV = (TextView) itemView.findViewById(R.id.app_name);
accountTV = (TextView) itemView.findViewById(R.id.account);
passwordTV = (TextView) itemView.findViewById(R.id.password);
}
}
}`
然后进行RecyclerView的绑定即可:` mAccountRecycleView = (RecyclerView) findViewById(R.id.account_list);
mAccountRecycleView.setLayoutManager(new LinearLayoutManager(this));
myAdapter = new MyAdapter();
mAccountRecycleView.setAdapter(myAdapter);`
至此,一次完整的RecyclerView的使用就结束了。完整的MainActivity的代码如下`import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.lvlin.passwordmanager.model.AccountMessage;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView mAccountRecycleView;
private List<AccountMessage> mAccount;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initView() {
mAccountRecycleView = (RecyclerView) findViewById(R.id.account_list);
mAccountRecycleView.setLayoutManager(new LinearLayoutManager(this));
myAdapter = new MyAdapter();
mAccountRecycleView.setAdapter(myAdapter);
}
private void initData() {
mAccount = new ArrayList<AccountMessage>();
AccountMessage accountMessage = new AccountMessage(null, "QQ", "1064968931", "123456" );
AccountMessage accountMessage1 = new AccountMessage(null, "QQ1", "1064968931", "123456" );
mAccount.add(accountMessage);
mAccount.add(accountMessage1);
}
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(MainActivity.this)
.inflate(R.layout.item_account, parent, false));
return holder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.appIconView.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher1));
holder.appNameTV.setText(mAccount.get(position).getAppName());
holder.accountTV.setText(mAccount.get(position).getAccount());
holder.passwordTV.setText(mAccount.get(position).getPassword());
}
@Override
public int getItemCount() {
return mAccount.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView appIconView;
TextView appNameTV;
TextView accountTV;
TextView passwordTV;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
appIconView = (ImageView) itemView.findViewById(R.id.app_icon);
appNameTV = (TextView) itemView.findViewById(R.id.app_name);
accountTV = (TextView) itemView.findViewById(R.id.account);
passwordTV = (TextView) itemView.findViewById(R.id.password);
}
}
}
}`