【问题标题】:Two cardview created, when trying to update the cardview尝试更新卡片视图时创建了两个卡片视图
【发布时间】:2020-07-04 14:26:01
【问题描述】:

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

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

同理,当用户从Activity A中点击编辑地址按钮**(Activity A中的数据传递给Activity B)**时,用户被导航到Activity B中的编辑地址页面。在这里用户可以输入客户姓名、地址第 1 行和地址第 2 行、城市、州和密码。

一旦在活动 B 中单击保存按钮,现有的卡片视图应该使用活动 A 中的新信息进行更新。

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

示例:如果用户有多个地址(A、B 和 C)并点击地址 B 卡片视图中的编辑按钮。然后用户被导航到活动 B 以编辑地址,一旦单击保存按钮,地址 B 卡片视图应使用最新信息进行更新。

截至目前的实际结果:使用更新的信息创建新的卡片视图,而不是在现有卡片视图中更新。

活动 A 中的代码:我对 addAddress 和 editAddress 使用相同的 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();
    }
}

活动 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 新手,请帮我解决这个问题。百万提前感谢您的解决方案! :)

【问题讨论】:

  • 您是否将地址存储在 SharedPrefs 之类的地方?
  • 我打算使用房间数据库而不是共享偏好。但到目前为止,唯一需要担心的是,当我编辑 cardview(update) 时,会创建一张新卡,而不是修改现有卡。

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


【解决方案1】:

你又犯了同样的错误。

在onActivityResult中每次都重新初始化List和adapter,所以每次你的数据长度为1,因为列表被重新初始化并添加新数据。

针对您目前的情况

您不能编辑已添加的列表数据。所以你需要做 2 件事,将 cardView 或列表位置传递给活动 2,并在成功编辑后将位置传递给活动 1。所以现在你有了一个职位。在 onActivityResult removeData 从列表中使用位置 Like list.remove(position); 并在删除后将数据添加到该位置。 list.add(position,data);

【讨论】:

  • 我只在 onCreate 中初始化了列表。如果我不调用在 onActivityResult 中设置适配器,在我的情况下,cardview 本身就不会被创建。现在使用上面的代码,在另一个下方创建了一个卡片视图。如果像你说的那样,如果它被重新初始化,它不会在另一个下面创建一个卡片视图,它只会覆盖现有的。
  • 无论如何 list.remove(position);和list.add(位置,数据);是我昨晚经历的那个。我会尝试并发布答案。
  • @SapthagiriManivannan 在你的 onCreate 中初始化这个东西并在 onResult 中调用 adapter.notifyDataSetChange。如果您已经完成,请使用新代码更新您的问题n-p reviews.add(new ProfileManageAddressGetterSetter(customer_name, address_one, address_two, city, state, pincode));适配器 = 新 ProfileManageAddressRecyclerAdapter(ProfileManageAdressFragment.this,评论); recyclerView.setAdapter(适配器);
  • 嘿兄弟,@deepakgupta7403 请查看此链接中的问题,看看您是否有答案。谢谢! stackoverflow.com/questions/62876824/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多