我正在为我的项目使用 ViewPager2。我需要在带有 viewpager2 的片段中使用嵌套片段。在我尝试在片段(不是嵌套片段)之间导航之前,它就像魅力一样。
第一次在片段之间导航后,应用程序崩溃并显示下面解释的错误。
包含嵌套片段 OnCreateView 方法的片段:
View view = inflater.inflate(R.layout.orders_fragment, null);
ViewPager2 viewPager = view.findViewById(R.id.childViewPager);
TabLayout tabs = view.findViewById(R.id.tabs);
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager(),getLifecycle());
viewPager.setAdapter(sectionsPagerAdapter);
TabLayoutMediator.TabConfigurationStrategy tabConfigurationStrategy = (tab, position) -> {
String[] order_activity_tabs = getResources().getStringArray(R.array.situations);
for (int i=0; i<order_activity_tabs.length; i++) {
if(i==position)
tab.setText(order_activity_tabs[i]);
}
};
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tabs, viewPager, tabConfigurationStrategy);
tabLayoutMediator.attach();
return view;
Run Code Online (Sandbox Code Playgroud)
当我返回包含嵌套片段的片段时,它会崩溃
java.lang.IllegalStateException: Fragment no longer exists for key f#0: unique id 4fbe17b8-5e22-4e07-a543-4a79445ad39c
at androidx.fragment.app.FragmentManagerImpl.getFragment(FragmentManagerImpl.java:365)
at androidx.viewpager2.adapter.FragmentStateAdapter.restoreState(FragmentStateAdapter.java:549)
at androidx.viewpager2.widget.ViewPager2.restorePendingState(ViewPager2.java:350)
at androidx.viewpager2.widget.ViewPager2.dispatchRestoreInstanceState(ViewPager2.java:375)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4045) …
Run Code Online (Sandbox Code Playgroud) android android-adapter android-fragments fragmentstatepageradapter android-viewpager2
这就是我向listview添加数组的方法:
ListView my_listview = (ListView)findViewById(R.id.listView1);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, my_array);
my_listview.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
my_array是一个文件的uri.
它运作良好.但是接下来我想要对一个新阵列进行排列,那么我不想用新的阵列替换,而是将新的阵列添加到现有的阵列中.我怎么能做到这一点?
我有我需要加载的缩略图的要求和Text
在ListView
其被通过自定义设置Adapter
.缩略图应存放在缓存中,供我使用的通用图像装载机不过我在它的实现非常困惑,以及如何在使用它按我的要求来加载图像ListView
从URL
.请通过良好的实施建议我一些方法.
我有一个带有a 的自定义适配器,ListFragment
但getView()
根本没有调用适配器.
这是适配器的样子 -
public class ModuleListItemAdapter extends BaseAdapter {
List<ModuleItem> list;
Context context;
Module mod;
public ModuleListItemAdapter() {
super();
// TODO Auto-generated constructor stub
}
public ModuleListItemAdapter(Context context, List<ModuleItem> list, Module mod) {
super();
this.list = list;
this.context = context;
this.mod = mod;
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.moduleitem, null);
GenerateModuleItemView gmiv …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的代码片段来实现自定义列表视图.
我的代码如下:
WeatherAdapter.java:
public class WeatherAdapter extends ArrayAdapter<weather>{
Context mcontext;
int mlayoutResourceId;
weather mdata[] = null;
View row;
public WeatherAdapter(Context context, int layoutResourceId, weather[] data) {
super(context, layoutResourceId, data);
mlayoutResourceId = layoutResourceId;
mcontext = context;
mdata = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
row = convertView;
WeatherHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ( (Activity) mcontext).getLayoutInflater();
row = inflater.inflate(mlayoutResourceId, parent, false);
holder = new WeatherHolder(row);
row.setTag(holder);
}
else
{
holder …
Run Code Online (Sandbox Code Playgroud) 我想要实现的目标:
我有一个自定义ListView适配器.对于每个Listitem,我想添加一个弹出菜单,与当前Google Play应用程序中的ListView非常相似.
这就是我试过的:我的大部分代码来自这个Android示例示例\ android-19\ui\ActionBarCompat-ListPopupMenu
CustomFragmentPageAdapter.java:
// create new fragment
mCustomFragment = CustomFragment.newInstance(position);
Run Code Online (Sandbox Code Playgroud)
CustomFragment.java
public class CustomFragment extends ListFragment implements View.OnClickListener{
...
@Override
public void onClick(final View v) {
v.post(new Runnable() {
@Override
public void run() {
showPopupMenu(v);
}
});
}
private void showPopupMenu(View view) {
PopupMenu popup = new PopupMenu(getActivity(), view);
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
popup.show();
}
Run Code Online (Sandbox Code Playgroud)
CustomArrayAdapter:
public class CustomAdapter extends ArrayAdapter<WatchListPlayerItem> {
...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos …
Run Code Online (Sandbox Code Playgroud) 我遇到以下方法的问题:
int firstVisibleItemPosition = gridLayoutManager.findFirstVisibleItemPosition();
int lastVisibleItemPosition = gridLayoutManager.findLastVisibleItemPosition();
Run Code Online (Sandbox Code Playgroud)
我的目标:保存有关用户查看过的项目的分析数据.
为了做到这一点,我在两种不同的场景中调用这些方法:
每次滚动都转到"空闲"状态,并检查可见项目是什么.在那种情况下,我得到了预期的索引.
当RecyclerView
变得对用户"可见"时.现在就是问题开始的时候.我希望当传递包含recylcerView的片段时,onResume()
调用findLastVisibleItemPosition()
将返回可见项. 但在这种情况下它返回-1. 我想这与RecyclerView +适配器内部项初始化相对于片段/活动生命周期的异步加载有关.
通过将此代码推迟几毫秒 - findLastVisibleItemPosition()
返回正确的索引.但我不想推迟硬编码使用处理程序+延迟runnable,因为调度延迟runnable是我真正想做的解决办法:检测回收器视图何时完成膨胀并将所有视图绘制到屏幕上脚里面..
所以我的问题基本上是:
如何检测RecyclerView何时完成所有初始化/测量/充气并将其绘制到屏幕上的子项?(在任何用户交互之前......).
有没有可靠的良好实践方法来确切知道回收者视图中的哪些项目真正显示在屏幕上?
我已经在我的ViewHolder上为我的RecyclerView实现了onClick监听器
但是当我执行非常快速的双击或鼠标点击时,它执行任务(在这种情况下打开一个单独的片段)两次或三次.
这是我的代码
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tvTitle, tvDescription;
public ViewHolder(View itemView) {
super(itemView);
itemView.setClickable(true);
itemView.setOnClickListener(this);
tvTitle = (TextView) itemView.findViewById(R.id.tv_title);
tvDescription = (TextView) itemView.findViewById(R.id.tv_description);
}
@Override
public void onClick(View v) {
mListener.onClick(FRAGMENT_VIEW, getAdapterPosition()); // open FRAGMENT_VIEW
}
}
Run Code Online (Sandbox Code Playgroud)
关于如何防止这种行为的任何想法?
android android-adapter android-fragments onclicklistener android-recyclerview
我使用本教程创建选项卡.现在我在每个片段中都有一个recyclerview,我想通过mainactivity通知他们.如何在片段中访问适配器?
我使用它来调用片段中的refreshData()方法:
TabFragment1 tabFragment = (TabFragment1) getSupportFragmentManager().findFragmentByTag(TabFragment1.class.getSimpleName());
if (tabFragment != null) {
tabFragment.refreshData();
}
Run Code Online (Sandbox Code Playgroud)
但是返回null.
主要活动:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
tabLayout.addTab(tabLayout.newTab().setText("Tab1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab2"));
final PagerAdapter adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
Run Code Online (Sandbox Code Playgroud)
PagerAdapter:
public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = …
Run Code Online (Sandbox Code Playgroud) 我想使用ButterKnife绑定我在listView adpater中的视图.
我试过这个,但我不能简单地使用我的"旋转器"var.
public class WarmSpinnerAdapter extends ArrayAdapter<Warm> {
Context context;
public WarmSpinnerAdapter(Context context, int resource, Warm[] objects) {
super(context, resource, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = LayoutInflater.from(context).inflate(R.layout.item_spinner, null);
return v;
}
@OnClick(R.id.spinner)
public void onClick() {
//open dialog and select
}
static class ViewHolder {
@BindView(R.id.spinner)
MyTextView spinner;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?