繁体   English   中英

如何将数据从活动传递到 android 中的回收器视图适配器

[英]How to pass data from a activity to a recycler view adapter in android

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

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

Activity B中单击保存按钮后,应在Activity A添加地址按钮下创建一个卡片视图。

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

谁能给我一个示例,将保存的数据从活动传递到回收器适配器。 我知道如何使用 putExtra 等将数据从回收器适配器传递到活动。

请帮助我。 百万提前谢谢!

活动 A 中的代码(添加地址按钮可用且回收站视图存在的位置)

public class ProfileManageAdressFragment extends AppCompatActivity {

    RecyclerView recyclerView;
    ProfileManageAddressRecyclerAdapter adapter;
    ArrayList<ProfileManageAddressGetterSetter> reviews;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_profile_manage_adress);

        Button addAddress = findViewById(R.id.addNewAddress);
        reviews = new ArrayList<>();
        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);
                startActivity(intent);
                
            }
        });
    }
}

负责在Activity A中添加卡片视图的代码段。 请让我知道如何在 Activity 中单击按钮时调用以下代码

reviews.add(new ProfileManageAddressGetterSetter("Customer Name", "address line 1", "address line 2"));
                recyclerView = findViewById(R.id.addressRecyclerView);
                recyclerView.setHasFixedSize(true);
                recyclerView.setLayoutManager(new LinearLayoutManager(ProfileManageAdressFragment.this));
                adapter = new ProfileManageAddressRecyclerAdapter(this, reviews);
                recyclerView.setAdapter(adapter);

Recycler 适配器中的代码

public class ProfileManageAddressRecyclerAdapter extends RecyclerView.Adapter<ProfileManageAddressRecyclerAdapter.ViewHolder> {

    private ArrayList<ProfileManageAddressGetterSetter> mDataset = new ArrayList<>();
    private Context context;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private TextView customer_name, address_one, address_two;
        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);
            
        }
    }

    public ProfileManageAddressRecyclerAdapter(View.OnClickListener 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);
        ProfileManageAddressRecyclerAdapter.ViewHolder vh = new ProfileManageAddressRecyclerAdapter.ViewHolder(view);
        return vh;
    }

    @Override
    public void onBindViewHolder(@NonNull 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());
    }


    @Override
    public int getItemCount() {
        return mDataset.size();
    }

}

在此处输入图像描述- 使用上述意图尝试从适配器调用后,结果为 0。

活动 B 中的代码

public class AddNewAddress extends AppCompatActivity {

    private EditText customer_name, address_one, address_two;
    private TextView cancel;
    private Button add_address;

    @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);
        cancel = findViewById(R.id.completeCancel);

        String cancel_text = "Cancel";

        SpannableString spanableObject = new SpannableString(cancel_text);
        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                Toast.makeText(AddNewAddress.this, "Clicked", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setColor(Color.BLUE);
            }
        };

        spanableObject.setSpan(clickableSpan, 0, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        cancel.setText(spanableObject);

        cancel.setMovementMethod(LinkMovementMethod.getInstance());

        final ProfileManageAdressFragment profileManageAdressFragment = new ProfileManageAdressFragment();
        add_address.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(AddNewAddress.this, ProfileManageAdressFragment.class);
                startActivity(intent);
            }
        });
    }

    private void setFragment(android.support.v4.app.Fragment fragment) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.main_frame, fragment).commit();
    }
}

更新 1:

请检查我更新的 Recycler 适配器。 当我运行时,此 0 显示在文本区域中,如附图所示。 我是 android 的新手。 请帮忙举个例子。

我终于通过使用 ActivityResult 实现了我的目标。 现在我可以将数据从 Activity 传递到 Cardview。

解决方案:在 Activity A 中单击按钮时,我使用 startResultActivity() 启动 Activity。 后来,当我触发了Activity B。 最终用户输入数据并使用 putExtra() 传递数据,一旦在 Activity B 中单击保存按钮,则在 Activity B 中单击 setResult() 和 finish()。

最后我在 Activity A 中定义 onActivityResult() 来得到结果。 效果很好!!

我会创建一个全局变量,然后将所有数据存储在该变量中,然后只需在适配器中调用该变量。

声明一个全局变量并为其分配 null 值:

public static String checking = null;

然后在需要时存储数据:

checking = check.getText().toString();

然后在您的适配器 class 中调用它。

首先在侦听器中制作接口侦听器,使用这样的参数制作 function

interface YourRecycleViewClickListener {
    fun onItemClickListener(param1:View, param2: String)
}

现在扩展您的活动

class YourActivity:YourRecycleViewClickListener{
    override fun onItemClickListener(param1:View, param2: String) {
        //do any thing
    }
}

第三步在你的回收适配器中制作接口契约

class YourAdapter(
    private val listener: YourRecycleViewClickListener){

    holder.constraintLayout.setOnClickListener{
      listener.onItemClickListener(param1,param2)
    }

}

这是 kotlin lang 和 java 相同但更改语法

这一切都要做

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM