android - android studio中Recycler视图的问题-仅偶尔出现
问题描述
我已经按照教程为我的应用程序创建了一个 recyclerview 我不工作,因为它只是偶尔在视图中显示任何东西 似乎根本没有任何理由或理由......
被回收的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parent_layout"
android:layout_width="match_parent"
android:layout_height="80dp">
<TextView
android:id="@+id/text_value"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="Test"
android:textColor="#000000"
android:textSize="18sp" />
</LinearLayout>
带有recyclerview的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="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view_accounts"/>
</LinearLayout>
RecyclerViewAdapter 类
public class RecyclerViewAdapterAccounts extends RecyclerView.Adapter<RecyclerViewAdapterAccounts.ViewHolder> {
private ArrayList<String> mlist;
private Context mContext;
public RecyclerViewAdapterAccounts(ArrayList<String> list, Context context) {
mlist = list;
mContext = context;
}
@NonNull
@Override
public RecyclerViewAdapterAccounts.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerViewAdapterAccounts.ViewHolder holder, final int position) {
holder.accountName.setText(mlist.get(position));
holder.parent_layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, mlist.get(position), Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return mlist.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView accountName;
LinearLayout parent_layout;
public ViewHolder(@NonNull View itemView) {
super(itemView);
accountName = itemView.findViewById(R.id.text_value);
parent_layout = itemView.findViewById(R.id.parent_layout);
}
}
}
相关的 onCreate 活动
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_accounts);
initAccounts();
RecyclerView recyclerView = findViewById(R.id.recycler_view_accounts);
RecyclerViewAdapterAccounts adapter = new RecyclerViewAdapterAccounts(accounts, this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter.notifyDataSetChanged();
}
尽管未显示,但我可以测试 initAccounts() 是否正在填充数组,因为我还可以看到 onCreateViewHolder 和 onBindViewHolder 没有被调用
有什么建议么???
编辑:继承人 initAccounts
private void initAccounts() {
DatabaseReference userRef =
FirebaseDatabase.getInstance().getReference().child("users");
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Iterator<DataSnapshot> children = snapshot.getChildren().iterator();
while (children.hasNext()) {
DataSnapshot child = children.next();
String[] parts = child.getValue().toString().split(",");
String role = parts[0].replace('{', ' ');
String msg = child.getKey() + ": " + role;
accounts.add(msg);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
解决方案
这里的问题是您正在添加对象accounts
但没有通知适配器有关更改。对您的代码进行以下更改。仅用于在内部设置适配器onCreate()
。
private RecyclerViewAdapterAccounts adapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_accounts);
initAccounts();
RecyclerView recyclerView = findViewById(R.id.recycler_view_accounts);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new RecyclerViewAdapterAccounts(accounts, this);
recyclerView.setAdapter(adapter);
}
现在创建一个方法RecyclerViewAdapterAccounts
来在适配器中添加元素;
public void addAll(ArratList<String> list){
mlist.clear();// To clear list if thats the case
mlist.addAll(list);
notifyDataSetChanged();
}
现在您可以一次性将所有元素添加到适配器。
public void onDataChange(@NonNull DataSnapshot snapshot) {
ArrayList<String> dataList=new ArrayList<>();
Iterator<DataSnapshot> children = snapshot.getChildren().iterator();
while (children.hasNext()) {
DataSnapshot child = children.next();
String[] parts = child.getValue().toString().split(",");
String role = parts[0].replace('{', ' ');
String msg = child.getKey() + ": " + role;
dataList.add(msg);
}
adapter.addAll(dataList);
}
推荐阅读
- python - Amazon Sagemaker 从 S3 存储桶打开 json
- javascript - 将 tiff 转换为 png 并在浏览器中显示
- python - 安装 tensorflow-gpu 破坏了 tensorflow
- android - 有什么方法可以在 android 房间数据库查询中绑定嵌入式类型的参数?
- r - 通过删除 tidyverse 中的重复条目来缩短 tibble/df
- java - 如何检测一个元素是否是数组中的最后一个元素?
- css - 将离子卡与 Angular 指令垂直对齐
- search - 有没有办法在用户停止输入后发送请求?
- kotlin - MapViewPlugin.kt: (168, 34): 只允许安全 (?.) 或非空断言 (!!.) 调用
- python - (Python) numpy genfromtxt 转换问题