[英]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.