如何根据 android 中的用户输入生成多个 cardview

How to generate multiple cardview based on user input in android

我正在尝试设计一个页面,地址存储在 recycler view -> cardview 中。

当用户单击 Activity A 中的添加地址按钮时,用户将导航到 Activity B 中的添加地址页面。在这里,用户可以输入客户名称、地址行 1 和地址第二行。

并且在 Activity B 中单击保存按钮后,应在 Activity A 中的添加地址按钮下创建卡片视图。

这个设计就像亚马逊移动应用添加地址选项一样。

示例: 如果最终用户有一个地址(将存在一个卡片视图)并且想要添加一个地址(第二个地址)。然后将使用新地址在现有卡片视图下方创建另一个卡片视图。

目前的实际结果:第二个地址正在第一个卡片视图中填充。 预期结果:当用户输入新地址时,应在现有地址下方创建一个新的卡片视图。

Activity中的代码A

public class ProfileManageAdressFragment extends AppCompatActivity {

    RecyclerView recyclerView;
    ProfileManageAddressRecyclerAdapter adapter;
    ArrayList<ProfileManageAddressGetterSetter> reviews;
    private Button addAddress;
    private String customer_name, address_one, address_two, city, state, pincode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_profile_manage_adress);
        addAddress = findViewById(R.id.addNewAddress);
        addAddress.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "Clicked", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(ProfileManageAdressFragment.this, AddNewAddress.class);
                startActivityForResult(intent, 1);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == 1) {
            if(resultCode == RESULT_OK) {
                customer_name = data.getStringExtra("customer_name");
                address_one = data.getStringExtra("address_one");
                address_two = data.getStringExtra("address_two");
                city = data.getStringExtra("city");
                state = data.getStringExtra("state");
                pincode = data.getStringExtra("pincode");

                reviews = new ArrayList<>();
                reviews.add(new ProfileManageAddressGetterSetter(customer_name, address_one, address_two, city, state, pincode));

                recyclerView = findViewById(R.id.addressRecyclerView);
                recyclerView.setHasFixedSize(true);
                recyclerView.setLayoutManager(new LinearLayoutManager(ProfileManageAdressFragment.this));
                adapter = new ProfileManageAddressRecyclerAdapter(ProfileManageAdressFragment.this, reviews);
                recyclerView.setAdapter(adapter);
            }
        }else if(resultCode == RESULT_CANCELED) {
            Toast.makeText(ProfileManageAdressFragment.this, "Cancelled", Toast.LENGTH_SHORT).show();
        }
    }
}

代码在Activity B

public class AddNewAddress extends AppCompatActivity {

    private EditText customer_name, address_one, address_two, city, state, pincode;
    private Button add_address;
    private String sCustomer_name, sAddress_one, sAddress_two, sCity, sState, sPincode;

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

        customer_name = findViewById(R.id.customerName);
        address_one = findViewById(R.id.addressOne);
        address_two = findViewById(R.id.addressTwo);
        add_address = findViewById(R.id.addAddress);
        city = findViewById(R.id.city);
        state = findViewById(R.id.state);
        pincode = findViewById(R.id.pincode);

        final ProfileFragment profileFragment = new ProfileFragment();
        add_address.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //setFragment(profileFragment);
                if(customer_name.getText().toString().equals("") || address_one.getText().toString().equals("") ||
                        address_two.getText().toString().equals("") || city.getText().toString().equals("") ||
                        state.getText().toString().equals("") || pincode.getText().toString().equals("")
                        ) {
                    Toast.makeText(AddNewAddress.this, "Please input all fields", Toast.LENGTH_LONG).show();
                }else {
                    sCustomer_name = customer_name.getText().toString();
                    sAddress_one = address_one.getText().toString();
                    sAddress_two = address_two.getText().toString();
                    sCity = city.getText().toString();
                    sState = state.getText().toString();
                    sPincode = pincode.getText().toString();

                    Intent intent = new Intent(AddNewAddress.this, ProfileManageAdressFragment.class);
                    intent.putExtra("customer_name", sCustomer_name);
                    intent.putExtra("address_one", sAddress_one);
                    intent.putExtra("address_two", sAddress_two);
                    intent.putExtra("city", sCity);
                    intent.putExtra("state", sState);
                    intent.putExtra("pincode", sPincode);
                    //startActivity(intent);
                    //startActivityForResult(intent, 1);
                    setResult(RESULT_OK, intent);
                    finish();
                }
            }
        });
    }
}

如果需要其他信息,请告诉我。万万提前解决方案! :)

所以,正如我所想,问题出在这几行

reviews = new ArrayList<>();
reviews.add(new ProfileManageAddressGetterSetter(customer_name, address_one, address_two, city, state, pincode));

您正在使用一项创建 ArrayList 的新对象,而不是更新现有的一项。之后,您将创建另一个适配器对象,而不是使用现有适配器对象并刷新它的数据。所以这就是为什么您看不到填充了另一个 CardView 的原因。

尝试为您的适配器添加下一个功能:

void addItems(items: ArrayList<ProfileManageAddressGetterSetter>) {
    this.items.addAll(items);
    notifyDataSetChanged();
}

当您收到来自 ActivityB 的结果时 - 在 addItems(items: ArrayList<ProfileManageAddressGetterSetter>) 函数的帮助下将其插入您的适配器。

为了更好地使用适配器,请将它的变量作为全局变量保存在您的 Activity class 中,并在需要时调用它。

你要处理的事情很多

在 ProfileManageAdressFragment

  • 命名约定更重要的是扩展 AppCompatActivity,class 名称是 ProfileManageAdressFragment。
  • 全局创建的不需要的按钮对象,将其设为本地对象。
  • 相同的字符串 customer_name 以及您在 onActivityResult 中使用的更多对象,因此无需全局初始化使其成为本地对象。
  • 每次重新初始化不需要的recyclerView和adapter时在onActivityResult中。在 onCreate 中初始化 recyclerView 和适配器,当您在 onActivityResult 中获取数据时,将数据添加到 ArrayList 并调用 adapter.notifyDataSetChange.
  • 在onActivityResult 中使用请求代码和ResultCode 的嵌套条件使其在单一条件下喜欢。 if (requestCode == 1 && resultCode == RESULT_OK){ code body }else {}

在添加新地址

  • 不需要所有全局初始化对象它只占用内存。因此,如果您不在方法之外使用,请在本地制作。
  • 而不是像这样检查值 customer_name.getText().toString().equals("") ,android 提供一个 class TextUtil 和 TextUtil 有一个方法 isEmpty 使用该方法.