【问题标题】:Dynamically add rows to a custom listView ( each row has multiple Strings )将行动态添加到自定义列表视图(每行有多个字符串)
【发布时间】:2017-10-20 20:53:53
【问题描述】:

我的上一个应用程序有一个自定义布局,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;
}

【问题讨论】:

标签: java android listview


【解决方案1】:

有两个问题:

  1. 您在onCreate() 方法中找不到voegToe。尝试在空对象上调用 setOnClickListener() 会产生 NPE。
  2. 您没有初始化您的列表。当您尝试将 setAdapter() 调用到您的 ListView 时,当它们为 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();
        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多