【问题标题】:How to generate multiple cardview based on user input in android如何根据android中的用户输入生成多个cardview
【发布时间】:2020-07-03 20:29:14
【问题描述】:

我正在尝试设计一个页面,其中地址存储在回收站视图 -> 卡片视图中。

当用户从活动A中点击添加地址按钮时,用户被导航到活动B中的添加地址页面。在这里用户可以输入客户名称、地址行1和地址行2。

并且一旦在Activity B中点击了保存按钮,应该在Activity A的添加地址按钮下创建一个cardview。

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

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

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

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

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

如果需要更多信息,请告诉我。百万提前感谢您的解决方案! :)

【问题讨论】:

    标签: java android android-activity android-recyclerview android-cardview


    【解决方案1】:

    有很多事情要处理

    在 ProfileManageAdressFragment 中

    • 命名约定更重要的是扩展 AppCompatActivity,类名为 ProfileManageAdressFragment。
    • 全局创建但不需要的按钮对象,将其设为本地 obj。
    • 相同的 String customer_name 和更多您在 onActivityResult 中使用的 obj,因此不需要全局初始化使其成为本地 Obj。
    • 每次重新初始化不需要的 recyclerView 和适配器时,在 onActivityResult 中。在 onCreate 中初始化 recyclerView 和适配器,当您在 onActivityResult 中获取数据时,将数据添加到 ArrayList 并调用 adapter.notifyDataSetChange。
    • 在 onActivityResult 中,对请求代码使用嵌套条件,而 ResultCode 使其在单个条件下像这样。 if (requestCode == 1 && resultCode == RESULT_OK){ 代码主体 }else {}

    在添加新地址中

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

    【讨论】:

    【解决方案2】:

    所以,我认为,问题出在这几行

    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&lt;ProfileManageAddressGetterSetter&gt;) 函数的帮助下将其插入适配器。

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

    【讨论】:

    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 2019-05-10
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多