如何在列表视图中添加多个项目 Android

How to add multiple items in Listview Android

我正在开发一个 Android 离线预订药物的应用程序。我已将 ListView 用于购物车,但每当我在购物车中添加新商品时,我之前的商品就会被替换。

L1 = imageacidity 
L2 = imagecough

 if(msg.toString().equals("L1")) {

       adapter = new ContactImageAdapter(this, R.layout.list, imageacidity);
       ListView dataList = (ListView) findViewById(R.id.list);
       dataList.setAdapter(adapter);
       adapter.notifyDataSetChanged();

   }
   if(msg.toString().equals("L2"))
   {

       adapter = new ContactImageAdapter(this, R.layout.list, imagecough);
       ListView dataList = (ListView) findViewById(R.id.list);
       dataList.setAdapter(adapter);
       adapter.notifyDataSetChanged();
   }

这里我在 imageacidityImagecough 数组中有 5 个元素。每当我 select 1 件商品时,它都会添加到购物车中,但是当我尝试 select 另一件商品时,它会被新商品替换。

您必须在适配器中添加元素。 我将 post 自定义适配器并向您展示如何正确添加元素。

适配器:

public class YourAdapter extends BaseAdapter {
    List<String> itens;
    private Context mContext;
    private static LayoutInflater inflater = null;

    public YourAdapter(Context context, List<String> itens){
        this.itens = itens;
        mContext = context;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return itens.size();
    }

    public String getItem(int position) {
        return itens.get(position);
    }

    public long getItemId(int position) {
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null)
            vi = inflater.inflate(R.layout.list_row, parent, false);

        String msg = itens.get(position);

        TextView tx = vi.findViewById(R.id.your_id);

        tx.setText(msg);

        return vi;
    }

    public void addItem(String item){
        itens.add(item);
    }

    public void addItens(List<String> itens){
        this.itens.addAll(itens);
    }
}

列表视图:

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

        adapter = new CustomAdapter(this,yourListOfItens);

        listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }

您可以在适配器的构造函数中设置初始数据,或者在点击按钮上使用方法 addItem 和 addAll。

您可以在 InputListAdapter 上使用算法(逻辑)检查和验证是否存在 MedicineVO(Value Object Pattern)项目在调用 notyChange(..) 方法之前的旧列表中。此外,您可以将逻辑包装在其他 class 中,例如 MedicineLogic 以提高适配器的可读性。

查看下面的示例代码:

    public class MedicineInputListAdapter extends ArrayAdapter<MedicineVo> {
    public static final int[]   COLORS  = new int[] { Color.WHITE, Color.BLUE };

    private Context mContext;
    private List<MedicineVo> medicineVos;
    private MedicineVo medicineVoActual;


    public BasePreOSPreventivaCorretivaInputListAdapter(Context context, int resource, List<MedicineVo> medicineVos) {
        super(context, resource, medicineVos);

        this.medicineVoActual = new MedicineVo();
        this.medicineVos = new ArrayList<MedicineVo>();
        this.medicineVos.addAll(medicineVos);

        this.mContext = context;

    }

    private static class ViewHolder {        
        TextView mMedicineTextView;
        //------------------------------------------------------
        // others Android view components 
        //------------------------------------------------------

    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;

        if (convertView == null) {

            //------------------------------------------------------
            // mapper from xml to view and add itens to holder
            //------------------------------------------------------





            //------------------------------------------------------
            // add event action to the mMedicineTextView
            //------------------------------------------------------
            viewHolder.mMedicineTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    TextView textView = (TextView) view;
                    MedicineVo medicineVo = (MedicineVo) textView.getTag();

                    boolean selected = medicineVo.getSelected();
                    if (selected) {
                        /*do it*/
                    }

                    refreshPreOSMaterialWhenUpdate(preOSMaterialVo);

                }
            });


            convertView.setTag(viewHolder);
        }
        else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        //------------------------------------------------------
        // get item and adjust color
        //------------------------------------------------------
        MedicineVo item = getItem(position);

        /*do it*/

        return convertView;
    }



    public void refreshMedicineListWhenUpdate(MedicineVo medicineVo){
        List<MedicineVo> newMedicineVos = new ArrayList<MedicineVo>();

        for (MedicineVo medicineVoOnList : medicineVos) {
            if( StringUtils.isNull(medicineVoOnList.getId()) )
                continue;

            if( MedicineLogic.existsOnList(medicineVos, medicineVoOnList) )
                continue;

            /* others checks if necessary */    

            newMedicineVos.add(medicineVoOnList);


        }
        medicineVos.addAll(newMedicineVos);
    }
}

如果您不能再 select,而您的 ListView 中只有一项,this 可能会有所帮助。

正如其他人对这个问题的评论,改变 ListView 的适配器也可以清除 selection,但我认为你发布的代码在 onCreate(或其他一种初始化)所以在那里设置适配器不会影响 selection(因为没有项目就不可能有 selection...:))

您所描述的数据被删除的问题之所以发生,是因为创建 new ContactImageAdapter 并调用 setAdapter,这将完全删除 ListView 中已有的数据。

如果你想正确实现问题中的代码,你需要这样的东西。

String msg = ""; // TODO: get this String value
ListView dataList = (ListView) findViewById(R.id.list);

// TODO: Define a single List to store the data and use that in *one* adapter
List<Contact> contacts = new ArrayList<Contact>();
adapter = new ContactImageAdapter(this, R.layout.list, contacts);
dataList.setAdapter(adapter);

// TODO: Replace this with the object to add to the adapter
Contact contact = null;

if(msg.equals("L1")) {
    // TODO: Use whatever values you want for "L1"
    int img = R.drawable.bati_acidity_1;
    String name = "Amlapitta";
    String price = "price 170";
    contact = new Contact(img, name, price); 
}
else if(msg.equals("L2")) {
    // TODO: Use whatever values you want for "L2"
    int img = R.drawable.bati_acidity_2;
    String name = "Amlapitta2";
    String price = "price 270";
    contact = new Contact(img, name, price); 
}
if (contact != null) {
    contacts.add(contact); 
    adapter.notifyDataSetChanged();
}

另一个问题是您在调用 notifyDataSetChanged 时并未实际更改 imageacidityimagecough 的数据集。