代码之家  ›  专栏  ›  技术社区  ›  Bardas George

元素不会与ListView的自定义适配器一起显示

  •  0
  • Bardas George  · 技术社区  · 8 年前

    因此,我想从我的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;
    }
    }
    

    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) {
    
            }
        });
    
    }
    

    我不理解为什么在使用adapter(元素)时它没有显示我的列表,但如果我使用arrayadapter,它工作得很好。

    using arrayadapter using element

    2 回复  |  直到 8 年前
        1
  •  0
  •   frozenkoi    8 年前

    ValueEventListener 回调修改 tasks element 适配器未使用 任务 作为其数据源。它使用从中复制的数组,该数组是通过调用 .toArray()

        2
  •  0
  •   Malik Ahsan    8 年前

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

    使用此

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

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