【问题标题】:How to pass data from a activity to a recycler view adapter in android如何将数据从活动传递到android中的recyclerview适配器
【发布时间】:2020-07-01 20:30:28
【问题描述】:

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

当用户点击Activity A中的添加地址按钮时,用户将被导航到Activity B中的添加地址页面。在这里用户可以输入客户姓名、地址第一行和地址第二行。

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);
                
            }
        });
    }
}

负责在活动 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();
    }

}

enter image description here - 使用上述意图尝试从适配器调用后,结果为 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 显示在文本区域中,如附图所示。我是安卓新手。请提供示例。

【问题讨论】:

  • 显示你到目前为止在代码中尝试过的内容
  • @Themelis 我已经添加了到目前为止我尝试将数据从回收器适配器传递到活动的代码。这工作正常。由于我是 android 新手,我不知道将数据从活动传递到回收器适配器。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    声明一个全局变量并为其赋值:

    public static String checking = null;
    

    a 然后在需要时存储数据:

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

    然后在你的适配器类中调用它。

    【讨论】:

    • 我根据您的评论进行了尝试,最终得到了附图中的答案(我已经在上面的 Recycler 适配器中更新了我的代码。请验证)。请更正或提供如何从适配器调用的示例。
    • 能否请您发布完整代码,以便我可以尝试并为您制定解决方案?
    • 添加了代码段 Tomáš Várady。百万提前感谢:)
    • 首先让我告诉你代码是一团糟......我知道你是新人我也是,但这是你必须遵守的第一条规则......总是让你的代码可读...例如使用更短的表达式而不是 ProfileManageAddressBlaBlaBlaBlaBla.. 你知道我的意思吗?一些更短但可读的东西,所以你会明白它是什么。然后有几件事我不明白你为什么要做。例如适配器中的构造函数......通常你给它一些可以使用的东西......所以这一切都来自我现在
    • 还有一件事......如果你使用公共而不是私人会更好......只是为了一般目的
    【解决方案3】:

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

    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 是一样的,只是语法不同

    所有要做的事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多