簡體   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