【问题标题】:Passing MainActivity's data via adapter通过适配器传递 MainActivity 的数据
【发布时间】:2019-03-26 22:26:06
【问题描述】:

我是 android 和 java 新手,但在我的第一个应用程序中,我有点在玩商店,你在 Play 商店看到的第一件事,然后转到第二个活动并在那里看到整个列表。我已经构建了水平 ArrayList,并且我也成功构建了第二个活动的 GridView,我的 ArrayList 是静态的,我的意思是它没有使用任何服务器。

我的问题是如何通过位于MainActivity 上的适配器将MainActivity 的数据发送到MainActivity2

这是我的主要活动,我的数据位于那里:

public class MainActivity extends AppCompatActivity {

private ArrayList<SectionDataModel> allSampleData;


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

    allSampleData = new ArrayList<>();


    RecyclerView recyclerView = findViewById(R.id.my_recycler_view1);
    recyclerView.setHasFixedSize(true);
    RecyclerViewDataAdapter adapter = new RecyclerViewDataAdapter(allSampleData, this);
    recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
    recyclerView.setAdapter(adapter);


    EssentialData();



}

public void EssentialData() {
    SectionDataModel Unit1 = new SectionDataModel();
    Unit1.setHeaderTitle("Unit 1");


    ArrayList<SingleItemModel> singleItemModels = new ArrayList<>();

    singleItemModels.add(new SingleItemModel("Word ", "Pronunciation", "Example", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.soft));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));
    singleItemModels.add(new SingleItemModel("The Apple", "Apple Store Is Open", "Description book", R.drawable.alferet));


    Unit1.setAllItemInSection(singleItemModels);
    allSampleData.add(Unit1);


}
  }

而我的 SectionDataAdapter 只有从它我才能将数据发送到 Second MainActivity,因为如果我从 MainActivity 本身发送数据,它会返回 Null:

public class SectionDataAdapter extends RecyclerView.Adapter<SectionDataAdapter.SingleItemRowHolder>{

private final Context mContext;

private ArrayList<SingleItemModel> itemModels;


//the constructor
public SectionDataAdapter(ArrayList<SingleItemModel> itemModels, Context mContext) {
    this.itemModels = itemModels;
    this.mContext = mContext;
}


@NonNull
@Override
public SingleItemRowHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_single_card, null);
    SingleItemRowHolder singleItemRowHolder = new SingleItemRowHolder(view);
    return singleItemRowHolder;
}




@Override
public void onBindViewHolder(@NonNull SingleItemRowHolder holder, int position) {
    SingleItemModel itemModel = itemModels.get(position);
    holder.tvTitle.setText(itemModel.getWord());
    holder.mitemImage.setImageResource(itemModel.getImage());
}


@Override
public int getItemCount() {return (null != itemModels ? itemModels.size() : 0);}

public class SingleItemRowHolder extends RecyclerView.ViewHolder {
    protected TextView tvTitle;
    protected ImageView mitemImage;



    public SingleItemRowHolder(final View itemView) {

        super(itemView);
        //Intent to start next activity
        final Intent intent = new Intent(mContext, ActivityDialogTheme.class);
        final Intent intent1 = new Intent(mContext, MainActivity2.class);

        final Activity activity = (Activity) mContext;

        this.mitemImage = itemView.findViewById(R.id.itemImage);
        this.tvTitle = itemView.findViewById(R.id.tvTitle);


        itemView.setOnClickListener(new View.OnClickListener(){


            @Override
            public void onClick(View v){
                Toast.makeText(v.getContext(), tvTitle.getText(), LENGTH_SHORT).show();
                //passing data to Tab1Fragment

                mContext.startActivity(intent1);
            }
        });
        itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(mContext,tvTitle.getText(), Toast.LENGTH_SHORT).show();
                mContext.startActivity(intent);

                //appearing animation
                activity.overridePendingTransition(R.anim.bottom_in, R.anim.fade_in_right);
                return true;
            }
        });
        }
    }
}

以及如何接收? 有人帮帮我。

【问题讨论】:

    标签: java android


    【解决方案1】:

    您的 SectionDataModel 需要实现 Parceble 接口。像下面你可以实现 -

    public class Person implements Parcelable{
    String name;
    int age;
    String sex;
    
    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    } 
     public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new BeanClass(in);
        }
    
        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
    @Override
    public int describeContents() {
        return 0;
    }
    
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeString(sex);
    }
    }
    

    将数据从适配器类传递给片段或活动 -

    @Override
        public void onClick(View v){
            Toast.makeText(v.getContext(), tvTitle.getText(), LENGTH_SHORT).show();
            //passing data to Tab1Fragment
            Bundle bundle = new Bundle();
            bundle.putParcelableArrayList("SectionDataModels", sectionDataModelList);
            intent1.putExtras(bundle);
            mContext.startActivity(intent1);
        }
    

    在activity中接收SectionDataModelList -

    ArrayList<SectionDataModel> listFromActivity =new ArrayList<>();
    
    listFromActivity=this.getIntent().getExtras().getParcelableArrayList("SectionDataModels");
    
        if (listFromActivity1 != null) {
    
            Log.d("listis",""+listFromActivity1.toString());
        }
    

    此外,您可以尝试使用这种方式接收 Intent 数据 - 如果您需要

    Bundle bundle = getActivity().getIntent().getExtras();
    model = bundle.getParcelable("SectionDataModels");
    
    OR
    
    Bundle bundle = this.getArguments();
    if (bundle != null) {
        model = bundle.getParcelable("SectionDataModels");
    }
    

    【讨论】:

    • 我没有完全问出我的问题。 MainActivity2 托管 3 个选项卡,其中一个我也需要接收它,因为我声明了所有选项卡 Fragment 并且每个选项卡的 Fragment 的功能就像 MainActivity 的适配器(SectionDataAdapter),它将显示 ArrayLists 的项目。这意味着我还必须在所有片段中接收 MainActivity 的 ArrayList。我该怎么做?
    【解决方案2】:

    为方便起见,您可以将其转换为 json 字符串格式,然后将其再次转换回您设置的模型对象列表并将其作为捆绑字符串传递,您可以使用 GSON 库来拥有轻松解析 json 格式和对象模型。

    【讨论】:

      【解决方案3】:

      这完全取决于列表的大小。

      您还可以使用和 arraylist 创建一个 parcelable 类,并将其发送到您的第二个活动。

      [1]Android Class Parcelable with ArrayList

      [2]Android: How to pass Parcelable object to intent and use getParcelable method of bundle?

      【讨论】:

        【解决方案4】:

        您可以将 ArrayList 设为公共静态,然后在第二个活动中导入它

        【讨论】:

        【解决方案5】:

        您可以将数组列表保留在您的应用程序类中,而不是第一个活动中(因为它在整个应用程序中都是相同的),然后只需将单击项目的位置从 activty1 传递到 activity2 使用 intent1.putExtra("position",position).

        在活动 2 中使用

        获取位置
        int position = getIntent().getIntExtra("position")
        

        现在只需使用此位置从应用程序类数组列表中获取模型类对象。

        【讨论】:

        • 你能说得更具体些吗?我真的需要根据我的 ArrayLists 的位置发送它们
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-15
        • 2021-03-31
        • 2021-06-20
        • 2020-04-24
        • 2020-12-03
        • 1970-01-01
        相关资源
        最近更新 更多