尝试更新卡片视图时创建了两个卡片视图
Two cardview created, when trying to update the cardview
我正在尝试设计一个页面,地址存储在 recycler view -> cardview 中。
当用户从 Activity A 单击添加地址按钮时,用户将导航到 Activity B 中的添加地址页面。在这里,用户可以输入客户名称、地址行 1 和地址第二行。
类似地,当用户从Activity A**点击编辑地址按钮时(activity A中的数据传递给activity B)**用户被导航到Activity B中的编辑地址页面。用户可以在此处输入客户姓名、地址第一行和地址第二行、城市、州和密码。
并且在 Activity B 中单击保存按钮后,现有卡片视图应使用 Activity A 中的新信息进行更新。
这个设计就像亚马逊移动应用添加地址选项一样。
示例: 如果用户有多个地址(A、B 和 C)并单击地址 B 卡片视图中的编辑按钮。然后用户导航到 Activity B 以编辑地址,单击保存按钮后,地址 B 卡片视图应更新为最新信息。
截至目前的实际结果:使用更新后的信息创建一个新的卡片视图,而不是在现有卡片视图中更新。
Activity 中的代码 A:我正在为 addAddress 和 editAddress[=13= 使用相同的 onActivityResult() ]
public class ProfileManageAdressFragment extends AppCompatActivity {
RecyclerView recyclerView;
ProfileManageAddressRecyclerAdapter adapter;
ArrayList<ProfileManageAddressGetterSetter> reviews;
@Override
protected void onCreate(Bundle savedInstanceState) {
Button addAddress;
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);
}
});
reviews = new ArrayList<>();
recyclerView = findViewById(R.id.addressRecyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(ProfileManageAdressFragment.this));
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String customer_name, address_one, address_two, city, state, pincode;
if (requestCode == 1 && 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.add(new ProfileManageAddressGetterSetter(customer_name, address_one, address_two, city, state, pincode));
adapter = new ProfileManageAddressRecyclerAdapter(ProfileManageAdressFragment.this, reviews);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
//saveData(customer_name, address_one, address_two, city, state, pincode);
} else if (requestCode == 2 && 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.add(new ProfileManageAddressGetterSetter(customer_name, address_one, address_two, city, state, pincode));
adapter = new ProfileManageAddressRecyclerAdapter(ProfileManageAdressFragment.this, reviews);
recyclerView.setAdapter(adapter);
//adapter.notifyDataSetChanged();
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(ProfileManageAdressFragment.this, "Cancelled", Toast.LENGTH_SHORT).show();
}
}
}
RecyclerAdapter 中的代码:
public class ProfileManageAddressRecyclerAdapter extends RecyclerView.Adapter<ProfileManageAddressRecyclerAdapter.ViewHolder> {
private ArrayList<ProfileManageAddressGetterSetter> mDataset = new ArrayList<>();
private String sCustomer_name, sAddress_one, sAddress_two, sCity, sState, sPincode;
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView customer_name, address_one, address_two, city, state, pincode;
private Button edit, remove;
public ViewHolder(View v) {
super(v);
customer_name = (TextView) v.findViewById(R.id.customerName);
address_one = (TextView) v.findViewById(R.id.addressLineOne);
address_two = v.findViewById(R.id.addressLineTwo);
city = (TextView) v.findViewById(R.id.cardCity);
state = (TextView) v.findViewById(R.id.cardState);
pincode = v.findViewById(R.id.cardPincode);
edit = v.findViewById(R.id.editAddress);
remove = v.findViewById(R.id.removeAddress);
}
}
public ProfileManageAddressRecyclerAdapter(ProfileManageAdressFragment profileManageAdressFragment, ArrayList<ProfileManageAddressGetterSetter> dataset) {
mDataset.clear();
mDataset.addAll(dataset);
}
@Override
public ProfileManageAddressRecyclerAdapter.ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_manage_address, parent, false);
final ProfileManageAddressRecyclerAdapter.ViewHolder vh = new ProfileManageAddressRecyclerAdapter.ViewHolder(view);
return vh;
}
@Override
public void onBindViewHolder(@NonNull final ProfileManageAddressRecyclerAdapter.ViewHolder holder, int position) {
ProfileManageAddressGetterSetter profileManageAddressGetterSetter = mDataset.get(position);
holder.address_one.setText(profileManageAddressGetterSetter.getAddress_line_1());
holder.address_two.setText(profileManageAddressGetterSetter.getGetAddress_line_2());
holder.customer_name.setText(profileManageAddressGetterSetter.getContractor_name());
holder.city.setText(profileManageAddressGetterSetter.getCity());
holder.state.setText(profileManageAddressGetterSetter.getState());
holder.pincode.setText(profileManageAddressGetterSetter.getPincode());
holder.edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), EditNewAddress.class);
switch (holder.getAdapterPosition()) {
case 0:
mDataset.remove(holder.getAdapterPosition());
notifyItemRemoved(holder.getAdapterPosition());
notifyItemRangeChanged(holder.getAdapterPosition(), mDataset.size());
Toast.makeText(v.getContext(), "Clicked", Toast.LENGTH_SHORT).show();
System.out.println("*********" + holder.address_one.getText());
sCustomer_name = holder.customer_name.getText().toString();
sAddress_one = holder.address_one.getText().toString();
sAddress_two = holder.address_two.getText().toString();
sCity = holder.city.getText().toString();
sState = holder.state.getText().toString();
sPincode = holder.pincode.getText().toString();
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);
((Activity) v.getContext()).startActivityForResult(intent,2);
break;
case 1:
Toast.makeText(v.getContext(), "Clicked", Toast.LENGTH_SHORT).show();
System.out.println("*********" + holder.address_one.getText());
sCustomer_name = holder.customer_name.getText().toString();
sAddress_one = holder.address_one.getText().toString();
sAddress_two = holder.address_two.getText().toString();
sCity = holder.city.getText().toString();
sState = holder.state.getText().toString();
sPincode = holder.pincode.getText().toString();
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);
((Activity) v.getContext()).startActivityForResult(intent,2);
break;
}
}
});
holder.remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDataset.remove(holder.getAdapterPosition());
notifyItemRemoved(holder.getAdapterPosition());
notifyItemRangeChanged(holder.getAdapterPosition(), mDataset.size());
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
}
代码在Activity B:
public class EditNewAddress 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);
Intent intent = getIntent();
sCustomer_name = intent.getStringExtra("customer_name");
sAddress_one = intent.getStringExtra("address_one");
sAddress_two = intent.getStringExtra("address_two");
sCity = intent.getStringExtra("city");
sState = intent.getStringExtra("state");
sPincode = intent.getStringExtra("pincode");
customer_name.setText(sCustomer_name);
address_one.setText(sAddress_one);
address_two.setText(sAddress_two);
city.setText(sCity);
state.setText(sState);
pincode.setText(sPincode);
add_address.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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(EditNewAddress.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(EditNewAddress.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);
setResult(RESULT_OK, intent);
finish();
}
}
});
}
}
我是 android 的新手,请帮我解决这个问题。万万提前解决方案! :)
你又犯了同样的错误。
每次在onActivityResult中重新初始化List和adapter,所以每次你的数据长度为1,因为list是重新初始化并添加新数据。
对于你现在的情况
您不能编辑已添加的列表数据。所以你需要做两件事将 cardView 或列表位置传递给 activity 2 并在成功编辑传递位置后再次传递给 activity 1。所以现在你有一个位置。在 onActivityResult 中使用位置 Like list.remove(position);
从列表中删除数据,并在删除后将数据添加到该位置。 list.add(position,data);
我正在尝试设计一个页面,地址存储在 recycler view -> cardview 中。
当用户从 Activity A 单击添加地址按钮时,用户将导航到 Activity B 中的添加地址页面。在这里,用户可以输入客户名称、地址行 1 和地址第二行。
类似地,当用户从Activity A**点击编辑地址按钮时(activity A中的数据传递给activity B)**用户被导航到Activity B中的编辑地址页面。用户可以在此处输入客户姓名、地址第一行和地址第二行、城市、州和密码。
并且在 Activity B 中单击保存按钮后,现有卡片视图应使用 Activity A 中的新信息进行更新。
这个设计就像亚马逊移动应用添加地址选项一样。
示例: 如果用户有多个地址(A、B 和 C)并单击地址 B 卡片视图中的编辑按钮。然后用户导航到 Activity B 以编辑地址,单击保存按钮后,地址 B 卡片视图应更新为最新信息。
截至目前的实际结果:使用更新后的信息创建一个新的卡片视图,而不是在现有卡片视图中更新。
Activity 中的代码 A:我正在为 addAddress 和 editAddress[=13= 使用相同的 onActivityResult() ]
public class ProfileManageAdressFragment extends AppCompatActivity {
RecyclerView recyclerView;
ProfileManageAddressRecyclerAdapter adapter;
ArrayList<ProfileManageAddressGetterSetter> reviews;
@Override
protected void onCreate(Bundle savedInstanceState) {
Button addAddress;
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);
}
});
reviews = new ArrayList<>();
recyclerView = findViewById(R.id.addressRecyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(ProfileManageAdressFragment.this));
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String customer_name, address_one, address_two, city, state, pincode;
if (requestCode == 1 && 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.add(new ProfileManageAddressGetterSetter(customer_name, address_one, address_two, city, state, pincode));
adapter = new ProfileManageAddressRecyclerAdapter(ProfileManageAdressFragment.this, reviews);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
//saveData(customer_name, address_one, address_two, city, state, pincode);
} else if (requestCode == 2 && 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.add(new ProfileManageAddressGetterSetter(customer_name, address_one, address_two, city, state, pincode));
adapter = new ProfileManageAddressRecyclerAdapter(ProfileManageAdressFragment.this, reviews);
recyclerView.setAdapter(adapter);
//adapter.notifyDataSetChanged();
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(ProfileManageAdressFragment.this, "Cancelled", Toast.LENGTH_SHORT).show();
}
}
}
RecyclerAdapter 中的代码:
public class ProfileManageAddressRecyclerAdapter extends RecyclerView.Adapter<ProfileManageAddressRecyclerAdapter.ViewHolder> {
private ArrayList<ProfileManageAddressGetterSetter> mDataset = new ArrayList<>();
private String sCustomer_name, sAddress_one, sAddress_two, sCity, sState, sPincode;
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView customer_name, address_one, address_two, city, state, pincode;
private Button edit, remove;
public ViewHolder(View v) {
super(v);
customer_name = (TextView) v.findViewById(R.id.customerName);
address_one = (TextView) v.findViewById(R.id.addressLineOne);
address_two = v.findViewById(R.id.addressLineTwo);
city = (TextView) v.findViewById(R.id.cardCity);
state = (TextView) v.findViewById(R.id.cardState);
pincode = v.findViewById(R.id.cardPincode);
edit = v.findViewById(R.id.editAddress);
remove = v.findViewById(R.id.removeAddress);
}
}
public ProfileManageAddressRecyclerAdapter(ProfileManageAdressFragment profileManageAdressFragment, ArrayList<ProfileManageAddressGetterSetter> dataset) {
mDataset.clear();
mDataset.addAll(dataset);
}
@Override
public ProfileManageAddressRecyclerAdapter.ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_manage_address, parent, false);
final ProfileManageAddressRecyclerAdapter.ViewHolder vh = new ProfileManageAddressRecyclerAdapter.ViewHolder(view);
return vh;
}
@Override
public void onBindViewHolder(@NonNull final ProfileManageAddressRecyclerAdapter.ViewHolder holder, int position) {
ProfileManageAddressGetterSetter profileManageAddressGetterSetter = mDataset.get(position);
holder.address_one.setText(profileManageAddressGetterSetter.getAddress_line_1());
holder.address_two.setText(profileManageAddressGetterSetter.getGetAddress_line_2());
holder.customer_name.setText(profileManageAddressGetterSetter.getContractor_name());
holder.city.setText(profileManageAddressGetterSetter.getCity());
holder.state.setText(profileManageAddressGetterSetter.getState());
holder.pincode.setText(profileManageAddressGetterSetter.getPincode());
holder.edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), EditNewAddress.class);
switch (holder.getAdapterPosition()) {
case 0:
mDataset.remove(holder.getAdapterPosition());
notifyItemRemoved(holder.getAdapterPosition());
notifyItemRangeChanged(holder.getAdapterPosition(), mDataset.size());
Toast.makeText(v.getContext(), "Clicked", Toast.LENGTH_SHORT).show();
System.out.println("*********" + holder.address_one.getText());
sCustomer_name = holder.customer_name.getText().toString();
sAddress_one = holder.address_one.getText().toString();
sAddress_two = holder.address_two.getText().toString();
sCity = holder.city.getText().toString();
sState = holder.state.getText().toString();
sPincode = holder.pincode.getText().toString();
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);
((Activity) v.getContext()).startActivityForResult(intent,2);
break;
case 1:
Toast.makeText(v.getContext(), "Clicked", Toast.LENGTH_SHORT).show();
System.out.println("*********" + holder.address_one.getText());
sCustomer_name = holder.customer_name.getText().toString();
sAddress_one = holder.address_one.getText().toString();
sAddress_two = holder.address_two.getText().toString();
sCity = holder.city.getText().toString();
sState = holder.state.getText().toString();
sPincode = holder.pincode.getText().toString();
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);
((Activity) v.getContext()).startActivityForResult(intent,2);
break;
}
}
});
holder.remove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDataset.remove(holder.getAdapterPosition());
notifyItemRemoved(holder.getAdapterPosition());
notifyItemRangeChanged(holder.getAdapterPosition(), mDataset.size());
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
}
代码在Activity B:
public class EditNewAddress 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);
Intent intent = getIntent();
sCustomer_name = intent.getStringExtra("customer_name");
sAddress_one = intent.getStringExtra("address_one");
sAddress_two = intent.getStringExtra("address_two");
sCity = intent.getStringExtra("city");
sState = intent.getStringExtra("state");
sPincode = intent.getStringExtra("pincode");
customer_name.setText(sCustomer_name);
address_one.setText(sAddress_one);
address_two.setText(sAddress_two);
city.setText(sCity);
state.setText(sState);
pincode.setText(sPincode);
add_address.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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(EditNewAddress.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(EditNewAddress.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);
setResult(RESULT_OK, intent);
finish();
}
}
});
}
}
我是 android 的新手,请帮我解决这个问题。万万提前解决方案! :)
你又犯了同样的错误。
每次在onActivityResult中重新初始化List和adapter,所以每次你的数据长度为1,因为list是重新初始化并添加新数据。
对于你现在的情况
您不能编辑已添加的列表数据。所以你需要做两件事将 cardView 或列表位置传递给 activity 2 并在成功编辑传递位置后再次传递给 activity 1。所以现在你有一个位置。在 onActivityResult 中使用位置 Like list.remove(position);
从列表中删除数据,并在删除后将数据添加到该位置。 list.add(position,data);