动态地将行添加到自定义listView(每行有多个字符串)

时间:2017-10-20 20:53:54

标签: java android listview

我的上一个应用有自定义布局listview,我可以添加项目,这些项目会显示在listview中。 现在,我想创建一个应用程序,也使用自定义布局listview,但每行存在3个不同的字符串,所以在我的应用程序将给出一个新行之前,你必须键入3个不同的字符串而不是他将成为新的一行。但是这不起作用......你可以帮助我在哪里弄错了吗?谢谢!

主要活动

ListView ListView ;

EditText editTextMerk ;
EditText editTextBeschrijving ;
EditText editTextKm ;

Button voegToe ;

ArrayList<String> merk;
ArrayList<String> beschrijving ;
ArrayList<String> km ;

CustomAdapter adapter ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editTextMerk = (EditText) findViewById(R.id.editTextMerk) ;
    editTextBeschrijving = (EditText) findViewById(R.id.editTextBeschrijving) ;
    editTextKm = (EditText) findViewById(R.id.editTextKm) ;

    ListView =(ListView) findViewById(R.id.Listview) ;
    adapter = new CustomAdapter(this , merk , beschrijving  , km ) ;
    ListView.setAdapter(adapter);

    voegToe.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            merk.add(editTextMerk.getText().toString()) ;
            beschrijving.add(editTextBeschrijving.getText().toString()) ;
            km.add(editTextKm.getText().toString()) ;

            adapter.notifyDataSetChanged();
        }
    });

}

这是我的CustomAdapter类

LayoutInflater mInflater ;

ArrayList<String> merk;
ArrayList<String> beschrijving ;
ArrayList<String> km ;

public CustomAdapter(Context c, ArrayList<String> merk, ArrayList<String> beschrijving, ArrayList<String> km) {

    this.merk = merk;
    this.beschrijving = beschrijving;
    this.km = km;

    mInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
}

@Override
public int getCount() {
    return merk.size();
}

@Override
public Object getItem(int position) {
    return merk.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = mInflater.inflate(R.layout.layout_row, null) ;

    TextView brand  = (TextView) v.findViewById(R.id.textViewMerk) ;
    TextView discription = (TextView) v.findViewById(R.id.textViewBeschrijving) ;
    TextView distance = (TextView) v.findViewById(R.id.textViewKm) ;

    brand.setText(merk.get(position));
    discription.setText(beschrijving.get(position));
    distance.setText(km.get(position));


    return v;
}

1 个答案:

答案 0 :(得分:0)

有两个问题:

  1. 您未在voegToe方法中找到onCreate()。尝试在空对象上调用setOnClickListener()会产生NPE。
  2. 您没有初始化列表。当他们尝试getCount()到您的ListView时调用setAdapter()时,将它们传递给null会产生NPE。
  3. 因此,您需要按如下方式更新您的活动:

    ListView listView;
    
    ...
    
    ArrayList<String> merk = new ArrayList<>();
    ArrayList<String> beschrijving = new ArrayList<>();
    ArrayList<String> km = new ArrayList<>();
    
    ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        editTextMerk = (EditText) findViewById(R.id.editText1);
        editTextBeschrijving = (EditText) findViewById(R.id.editText2);
        editTextKm = (EditText) findViewById(R.id.editText3);
        voegToe = (Button) findViewById(R.id.button);
    
        listView = (ListView) findViewById(R.id.list);
        adapter = new CustomAdapter(this, merk, beschrijving, km);
        listView.setAdapter(adapter);
    
        voegToe.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                merk.add(editTextMerk.getText().toString());
                beschrijving.add(editTextBeschrijving.getText().toString());
                km.add(editTextKm.getText().toString());
                adapter.notifyDataSetChanged();
            }
        });
    }