如何根据 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 使用该方法.
我正在尝试设计一个页面,地址存储在 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 使用该方法.