繁体   English   中英

动态添加行到自定义 listView (每行有多个 Strings )

[英]Dynamically add rows to a custom listView ( each row has multiple Strings )

我的最后一个应用程序有一个自定义布局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. 您没有在onCreate()方法中找到voegToe 尝试在空对象上调用setOnClickListener()会产生 NPE。
  2. 您没有初始化您的列表。 当您尝试将setAdapter()为 ListView 时调用getCount()时,在它们为 null 时传递它们会产生 NPE。

因此,您需要按如下方式更新您的 Activity:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM