首页 > 解决方案 > 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) {
    }
});

}

标签: androidandroid-recyclerview

解决方案


这里的问题是您正在添加对象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);
    }

推荐阅读