元素不显示 ListView 的自定义适配器

Elements doesn't show up with custom adapter for ListView

所以,我想从我的 Listview 自定义元素,我制作了一个自定义适配器。

public class elementList extends BaseAdapter {

Context context;
String[] data;
private static LayoutInflater inflater = null;

public elementList(Context context, String[] data) {
    this.context = context;
    this.data = data;
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return data.length;
}

@Override
public Object getItem(int position) {
    return data[position];
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if(vi == null)
        vi = inflater.inflate(R.layout.task, null);
    TextView text = (TextView)vi.findViewById(R.id.title);
    Log.d("TAG", "DA");
    text.setText(data[position]);
    return vi;
}
}

这是我的主要内容activity

private void showTasks(){
    final ArrayList<String> taskList = new ArrayList<String>();

    ListView listView = (ListView)findViewById(R.id.listView);

    final List<String> tasks = new ArrayList<String>(taskList);
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tasks);
    final elementList element = new elementList(this, tasks.toArray(new String[0]));
    listView.setAdapter(element);

    FirebaseAuth mAuth = FirebaseAuth.getInstance();
    FirebaseUser user = mAuth.getCurrentUser();
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference adress = database.getReference("users/" + user.getUid() + "/tasksList");
    adress.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            try{
                if(dataSnapshot.getValue() != null){
                    Map<String, String> value = (Map<String, String>)dataSnapshot.getValue();
                    for (Map.Entry<String, String> entry : value.entrySet()){
                        tasks.add(entry.getValue());
                        Log.d("VALOARE", entry.getValue());
                        element.notifyDataSetChanged();
                    }
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

我不明白为什么如果我使用我的适配器(元素)它没有显示在我的列表中,但如果我使用 arrayadapter 它工作正常。

在第一张图片中,我使用了 arrayadapter,在第二个元素中。我想提一下,它不会崩溃或出现任何错误。

原因是对 ValueEventListener 回调的调用修改了 tasks,但 element 适配器未使用 tasks 作为其数据源。它正在使用通过调用 .toArray()

从中复制的数组

而不是将列表值作为数组传递。将 Arraylist 任务传递给您在 showTasks() 方法中修改的自定义适配器。

使用这个

 final elementList element = new elementList(this, tasks);

而不是

final elementList element = new elementList(this, tasks.toArray(new String[0]));

并更改您的自定义适配器构造函数以获取 arraylist 的值而不是字符串数组。