Android 第二次作业:RecyclerView
结果展示:
代码过程
xml文件
1.xml文件
<?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="wrap_content"
android:background="@drawable/corner"
android:padding="10dp"
android:layout_margin="8dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="TextView"
android:paddingLeft="15dp"
android:textSize="30sp" />
<Space
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:maxWidth="32dp"
android:maxHeight="32dp"
android:scaleType="fitCenter"
/>
</LinearLayout>
Java文件
1.新建适配器Adapter
public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {
// 当前app 运行环境参数
private Context context;
private List<String> list;
private List<Integer> imgList;
private View inflater;
public Adapter(Context context, List<String> list, List<Integer> imgList) {
this.context = context;
this.list = list;
this.imgList = imgList;
notifyDataSetChanged();
}
@Override
public Adapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
// item xml文件
inflater = LayoutInflater.from(context).inflate(R.layout.item, viewGroup, false);
MyViewHolder myViewHolder = new MyViewHolder(inflater);
return myViewHolder;
}
@Override
public void onBindViewHolder(Adapter.MyViewHolder holder, int position) {
// 将list 中的值绑定到 Adapter中
holder.textView.setText(list.get(position));
holder.imageView.setImageResource(imgList.get(position));
}
@Override
public int getItemCount() {
// 返回list的长度
return list.size();
}
public void onItemDismiss(int position) {
if (position < 0 || position > getItemCount()) {
return;
}
list.remove(position);
notifyItemRemoved(position);
// 解决 RecyclerView 删除 Item 导致位置错乱的问题
if(position != list.size()) {
notifyItemRangeChanged(position, list.size() - position);
}
}
class MyViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView_item);
imageView = itemView.findViewById(R.id.imageView);
}
}
}
3.修改WechatFragment
public class WechatFragment extends Fragment {
private View view;
private RecyclerView recyclerView;
private List<String> list;
private List<Integer> imgList;
private Context context;
private Adapter adapter;
public WechatFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.tab_home, container, false);
recyclerView = view.findViewById(R.id.recyclerView);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
context = (MainActivity)getActivity();
initResource();
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
adapter = new Adapter(context, list, imgList);
ItemTouchHelper.Callback callback = new SwipeItemTouchHelper(adapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(recyclerView);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(adapter);
}
// 初始化各种资源
private void initResource() {
list = new ArrayList<>();
imgList = new ArrayList<>();
Map<Integer, String> map = new HashMap<>();
map.put(R.drawable.friend, "我的朋友");
map.put(R.drawable.address,"我的通讯录");
map.put(R.drawable.xiaolan,"新兰永恒");
map.put(R.drawable.tu,"新兰万岁");
map.put(R.drawable.pian,"美");
for (Integer key : map.keySet()) {
list.add(map.get(key));
imgList.add(key);
}
}
}
当然其中一些细微的布局问题我参考了网上的一些大佬的解决方案。
最后需要注意的一点是一开始是没有recyclerview
这个包的,需要在build.gradle中的dependencies
闭包中添加其依赖
implementation 'androidx.recyclerview:recyclerview:1.1.0'
下面是新的内容在通讯录页面添加人物消息
核心代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
userAccounts=new ArrayList<>();
myAdapter=new MyAdapter(this,userAccounts);
recyclerView=findViewById(R.id .recyclerView);
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
linearLayoutManager.setOrientation(OrientationHelper .VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(myAdapter);
initView();
initFragment();
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
View view1= LayoutInflater.from(MainActivity.this).inflate(R.layout.dialogview,null,false);
final EditText edusername=view1.findViewById(R.id.ed_username);
final EditText edpassword=view1.findViewById(R.id.ed_password);
new AlertDialog.Builder(MainActivity.this)
.setTitle("用户信息输入")
.setView(view1)
.setPositiveButton("添加", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
UserAccount userAccount=new UserAccount();
userAccount.setUsername(edusername.getText().toString().trim());
userAccount.setPassword(edpassword.getText().toString().trim());
userAccounts.add(userAccount);
myAdapter.notifyDataSetChanged();
}
}).setNegativeButton("取消",null).show();
}
});
}
MyAdapter.java
package com.example.zzh;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.*;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
private List<UserAccount>userAccounts;
private Context mContext;
public MyAdapter(Context context,List<UserAccount>userAccounts){
mContext=context;
this.userAccounts=userAccounts;
}
public MyHolder onCreateViewHolder( ViewGroup viewGroup, int i) {
View view= LayoutInflater.from(mContext).inflate(R.layout.itemview,null);
MyHolder myHolder=new MyHolder(view);
return myHolder;
}
public void onBindViewHolder( MyHolder myHolder, int i) {
((TextView)myHolder.finViewById(R.id.tv_username)).setText(userAccounts.get(i).getUsername());
((TextView)myHolder.finViewById(R.id.tv_password)).setText(userAccounts.get(i).getPassword());
}
public int getItemCount() {
return userAccounts.size();
}
}
UserAccount:
package com.example.zzh;
public class UserAccount {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
参考链接:
RecyclerView
源码地址:
码云仓库