Java 如何在android中基于用户输入生成多个cardview

Java 如何在android中基于用户输入生成多个cardview,java,android,android-activity,android-recyclerview,android-cardview,Java,Android,Android Activity,Android Recyclerview,Android Cardview,我正在尝试设计一个页面,其中地址存储在recycler view->cardview中 当用户单击活动A中的“添加地址”按钮时,用户将被导航到活动B中的“添加地址”页面。在此,用户可以输入客户名称、地址行1和地址行2 在活动B中单击“保存”按钮后,应在活动a中的“添加地址”按钮下创建cardview 此设计与亚马逊移动应用程序添加地址选项类似。 示例:如果最终用户有一个地址(将出现一个cardview)并希望再添加一个地址(第二个地址)。然后,将在现有cardview下方创建另一个具有新地址的c

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

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

在活动B中单击“保存”按钮后,应在活动a中的“添加地址”按钮下创建cardview

此设计与亚马逊移动应用程序添加地址选项类似。

示例:如果最终用户有一个地址(将出现一个cardview)并希望再添加一个地址(第二个地址)。然后,将在现有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();
        }
    }
}

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

所以,正如我所认为的,问题在于这方面

reviews = new ArrayList<>();
reviews.add(new ProfileManageAddressGetterSetter(customer_name, address_one, address_two, city, state, pincode));
reviews=newarraylist();
添加(新ProfileManageAddressGetterSetter(客户名称、地址一、地址二、城市、州、pincode));
您正在使用一个项目创建ArrayList的新对象,而不是更新现有项目。之后,您将创建适配器的另一个对象,而不是使用现有对象并刷新其数据。这就是为什么你看不到另一个CardView被填充的原因

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

void addItems(items: ArrayList<ProfileManageAddressGetterSetter>) {
    this.items.addAll(items);
    notifyDataSetChanged();
}
void附加项(项:ArrayList){
this.items.addAll(items);
notifyDataSetChanged();
}
当您从ActivityB收到结果时,请借助
附加项(items:ArrayList)
函数将其插入适配器


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

因此,正如我所想,问题在于这几行

reviews = new ArrayList<>();
reviews.add(new ProfileManageAddressGetterSetter(customer_name, address_one, address_two, city, state, pincode));
reviews=newarraylist();
添加(新ProfileManageAddressGetterSetter(客户名称、地址一、地址二、城市、州、pincode));
您正在使用一个项目创建ArrayList的新对象,而不是更新现有项目。之后,您将创建适配器的另一个对象,而不是使用现有对象并刷新其数据。这就是为什么你看不到另一个CardView被填充的原因

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

void addItems(items: ArrayList<ProfileManageAddressGetterSetter>) {
    this.items.addAll(items);
    notifyDataSetChanged();
}
void附加项(项:ArrayList){
this.items.addAll(items);
notifyDataSetChanged();
}
当您从ActivityB收到结果时,请借助
附加项(items:ArrayList)
函数将其插入适配器


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

有许多事情需要处理

在ProfileManagedAddressFragment中

  • 命名约定更重要的是扩展了AppCompatActivity,类名是ProfileManageAddressFragment
  • 全局创建的按钮对象不是必需的,将其设为本地对象
  • 在onActivityResult中使用相同的字符串customer_名称和更多的obj,因此不需要全局初始化,使其成为本地obj
  • 在onActivityResult中,每次重新初始化不需要的recyclerView和适配器时。在onCreate中初始化recyclerView和适配器,并在onActivityResult中获取数据时将数据添加到ArrayList并调用adapter.notifyDataSetChange
  • 在onActivityResult中,对请求代码和结果代码使用嵌套条件使其处于单个条件下,如。如果(requestCode==1&&resultCode==RESULT_OK){code body}else{}
新增地址

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

    • 有很多事情你必须处理

      在ProfileManagedAddressFragment中

      • 命名约定更重要的是扩展了AppCompatActivity,类名是ProfileManageAddressFragment
      • 全局创建的按钮对象不是必需的,将其设为本地对象
      • 在onActivityResult中使用相同的字符串customer_名称和更多的obj,因此不需要全局初始化,使其成为本地obj
      • 在onActivityResult中,每次重新初始化不需要的recyclerView和适配器时。在onCreate中初始化recyclerView和适配器,并在onActivityResult中获取数据时将数据添加到ArrayList并调用adapter.notifyDataSetChange
      • 在onActivityResult中,对请求代码和结果代码使用嵌套条件使其处于单个条件下,如。如果(requestCode==1&&resultCode==RESULT_OK){code body}else{}
      新增地址

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

      谢谢你的解决方案,伙计!伙计,我还有一个问题要解决。如果你有任何想法,你能研究一下并提供解决方案吗?谢谢你的解决方案,伙计!伙计,我还有一个问题要解决。如果你有任何想法,你能研究一下并提供解决方案吗?老兄,我还有一个问题,我被困在里面了。如果你有任何想法,你能研究一下并提供解决方案吗?老兄,我还有一个问题,我被困在里面了。如果你有任何想法,你能研究一下并提供解决方案吗?