Android 将 ArrayList<Model> 从 Activity 传递给 Fragment
Posted
技术标签:
【中文标题】Android 将 ArrayList<Model> 从 Activity 传递给 Fragment【英文标题】:Android passing ArrayList<Model> to Fragment from Activity 【发布时间】:2017-02-13 12:53:48 【问题描述】:您好,我想将数据 ArrayList<Division>
发送到 Fragment 类 ListContentFragment
。
在MainActivity
中,我正在进行网络调用以获取数据(JSON
),然后对其进行解析以创建ArrayList<Division>
,现在我想用收到的数据填充列表视图(现在在@987654326 @)
主活动
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Adding Toolbar to Main screen
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Setting ViewPager for each Tabs
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
// Set Tabs inside Toolbar
TabLayout tabs = (TabLayout) findViewById(R.id.tabs);
tabs.setupWithViewPager(viewPager);
// Create Navigation drawer and inlfate layout
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
// Adding menu icon to Toolbar
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null)
VectorDrawableCompat indicator
= VectorDrawableCompat.create(getResources(), R.drawable.ic_menu, getTheme());
indicator.setTint(ResourcesCompat.getColor(getResources(),R.color.white,getTheme()));
supportActionBar.setHomeAsUpIndicator(indicator);
supportActionBar.setDisplayHomeAsUpEnabled(true);
// Set behavior of Navigation drawer
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener()
// This method will trigger on item Click of navigation menu
@Override
public boolean onNavigationItemSelected(MenuItem menuItem)
// Set item in checked state
menuItem.setChecked(true);
// TODO: handle navigation
Toast.makeText(MainActivity.this, "Clicked: " + menuItem.getTitle(), Toast.LENGTH_SHORT).show();
// Closing drawer on item click
mDrawerLayout.closeDrawers();
return true;
);
// Adding Floating Action Button to bottom right of main view
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Snackbar.make(v, "Hello Snackbar!",
Snackbar.LENGTH_LONG).show();
);
// Network request test with volley
NetworkRequests networkRequest = new NetworkRequests(this);
networkRequest.fetchDummyData();
divisionList = networkRequest.getDivisions();
// Add Fragments to Tabs
private void setupViewPager(ViewPager viewPager)
Adapter adapter = new Adapter(getSupportFragmentManager());
adapter.addFragment(new ListContentFragment(), "List");
adapter.addFragment(new TileContentFragment(), "Tile");
adapter.addFragment(new CardContentFragment(), "Card");
viewPager.setAdapter(adapter);
Fragment(目前是硬编码,想用 ArrayList 填充)
public class ListContentFragment extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
RecyclerView recyclerView = (RecyclerView) inflater.inflate(
R.layout.recycler_view, container, false);
ContentAdapter adapter = new ContentAdapter(recyclerView.getContext());
recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
return recyclerView;
public static class ViewHolder extends RecyclerView.ViewHolder
public ImageView avator;
public TextView name;
public TextView description;
public ViewHolder(LayoutInflater inflater, ViewGroup parent)
super(inflater.inflate(R.layout.item_list, parent, false));
avator = (ImageView) itemView.findViewById(R.id.list_avatar);
name = (TextView) itemView.findViewById(R.id.list_title);
description = (TextView) itemView.findViewById(R.id.list_desc);
itemView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Context context = v.getContext();
Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra(DetailActivity.EXTRA_POSITION, getAdapterPosition());
context.startActivity(intent);
);
/**
* Adapter to display recycler view.
*/
public static class ContentAdapter extends RecyclerView.Adapter<ViewHolder>
// Set numbers of List in RecyclerView.
private static final int LENGTH = 18;
private final String[] mPlaces;
private final String[] mPlaceDesc;
private final Drawable[] mPlaceAvators;
public ContentAdapter(Context context)
Resources resources = context.getResources();
mPlaces = resources.getStringArray(R.array.places);
mPlaceDesc = resources.getStringArray(R.array.place_desc);
TypedArray a = resources.obtainTypedArray(R.array.place_avator);
mPlaceAvators = new Drawable[a.length()];
for (int i = 0; i < mPlaceAvators.length; i++)
mPlaceAvators[i] = a.getDrawable(i);
a.recycle();
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
return new ViewHolder(LayoutInflater.from(parent.getContext()), parent);
@Override
public void onBindViewHolder(ViewHolder holder, int position)
holder.avator.setImageDrawable(mPlaceAvators[position % mPlaceAvators.length]);
holder.name.setText(mPlaces[position % mPlaces.length]);
holder.description.setText(mPlaceDesc[position % mPlaceDesc.length]);
@Override
public int getItemCount()
return LENGTH;
【问题讨论】:
【参考方案1】:如果您想将 ArrayList 传递给片段,则需要确保 Model 类实现 Parcelable。 这里我可以举个例子。
public class ObjectName implements Parcelable
public ObjectName(Parcel in)
super();
readFromParcel(in);
public static final Parcelable.Creator<ObjectName> CREATOR = new Parcelable.Creator<ObjectName>()
public ObjectName createFromParcel(Parcel in)
return new ObjectName(in);
public ObjectName[] newArray(int size)
return new ObjectName[size];
;
public void readFromParcel(Parcel in)
Value1 = in.readInt();
Value2 = in.readInt();
Value3 = in.readInt();
public int describeContents()
return 0;
public void writeToParcel(Parcel dest, int flags)
dest.writeInt(Value1);
dest.writeInt(Value2);
dest.writeInt(Value3);
然后您可以将ArrayList<ObjectName>
添加到 Bundle 对象。
ArrayList<ObjectName> arraylist = new Arraylist<ObjectName>();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("arraylist", arraylist);
fragment.setArguments(bundle);
在此之后,您可以使用以下方法取回此数据,
Bundle extras = getIntent().getExtras();
ArrayList<ObjectName> arraylist = extras.getParcelableArrayList("arraylist");
最后,您可以在片段中显示包含这些数据的列表。希望这将有助于您获得预期的答案。
【讨论】:
谢谢 Alex.. 我会实现的。【参考方案2】:我也遇到了同样的问题。 你可以试试这个。 而不是将数组列表作为捆绑包发送到片段。使数组列表被传递,在活动中作为公共和静态的。
public static Arraylist<Division> arraylist;
然后在解析并添加数组列表中的数据后,对片段进行调用。在片段中,您可以将数组列表用作:
ArrayList<Division> list=MainActivity.arraylist;
【讨论】:
有什么缺点? 内存泄漏是产生静态变量或对象的主要原因 如果Activity没有被销毁,那么怎么会发生内存泄漏呢?你能解释一下吗?以上是关于Android 将 ArrayList<Model> 从 Activity 传递给 Fragment的主要内容,如果未能解决你的问题,请参考以下文章
将 ArrayList 的子级发送到 Android Activity
ArrayList<String> 使用改造 android 解析成 recyclerview