我已将我targetSdkVersion
的 28更新到 30,我注意到它getAdapterPosition()
已被弃用(我不确定何时发生这种情况)。
在文档中,他们说:
此方法已弃用。
当适配器嵌套其他适配器时,此方法会造成混淆。如果您在 Adapter 的上下文中调用它,您可能想要调用getBindingAdapterPosition()或者如果您想要 RecyclerView 看到的位置,您应该调用getAbsoluteAdapterPosition()。
该文档还说明了以下内容:
请注意,如果您正在查询 RecyclerView 看到的位置,则应使用getAbsoluteAdapterPosition()(例如,您想使用它来保存滚动状态)。如果您要查询访问 RecyclerView.Adapter 内容的位置,则应使用getBindingAdapterPosition()。
我的理解是:
getBindingAdapterPosition
当您想要获取适配器位置时应该使用它(如果它仍然存在于适配器中)。如果它不再存在于适配器中,它将返回-1
( NO_POSITION )。getAbsoluteAdapterPosition
应该用于获取位置,如RecyclerView
所见。例如,如果某个项目已被删除,但尚未从ViewHolder
.换句话说,如果我的 中有4
项目Adapter
,我删除位置0
和查询,getAbsoluteAdapterPosition
并且getBindingAdapterPosition
在项目从 中删除之前ViewHolder
,然后getAbsoluteAdapterPosition
将返回0
(因为视图仍在 中ViewHolder
)并getBindingAdapterPosition
返回-1
(因为它不再存在于适配器中)。
我通过记录以下内容测试了差异:
Log.e("difference", "getAdapterPosition = "+myHolder.getAdapterPosition()+" getBindingAdapterPosition = "+myHolder.getBindingAdapterPosition()+" getAbsoluteAdapterPosition = "+myHolder.getAbsoluteAdapterPosition()); …
Run Code Online (Sandbox Code Playgroud) 我ListView
正在使用扩展名BaseAdapter
,我无法正确刷新它.当我刷新时,似乎旧数据在新数据之上绘制,直到滚动事件发生.旧行绘制在新行的顶部,但是当我开始滚动时,旧行会消失.
我已经打过电话invalidateViews()
,notifyDataSetChanged()
和notifyDataSetInvalidated()
.我的代码看起来像:
private void updateData()
{
List<DataItems> newList = getNewList();
MyAdapter adapter = new MyAdapter(getContext());
//my adapter holds an internal list of DataItems
adapter.setList(newList);
mList.setAdapter(adapter);
adapter.notifyDataSetChanged();
mList.invalidateViews();
}
Run Code Online (Sandbox Code Playgroud) 这是片段的代码,我在其中为列表设置自定义适配器.
没有错误,但是ListView
空的.我实现getCount()
了在ArrayList中返回正确数量的项目.我没有("Inside", "GetView")
在logcat中看到
分段
public class ServiceCarListFragment extends Fragment {
private String url;
private ArrayList<CarDetail> carDetailList = new ArrayList<CarDetail>();
private CarListAdapter adapter;
private ListView mList;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
url = getActivity().getIntent().getStringExtra("url");
new DownloadCarDetail().execute(url);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View v = inflater.inflate(R.layout.fragment_service_car_list, container, false);
mList = (ListView) v.findViewById(R.id.list);
mList.setAdapter(adapter);
for (CarDetail car : carDetailList) …
Run Code Online (Sandbox Code Playgroud) 我有一个FragmentPagerAdapter.它的getItem
方法可以根据它从外部获得的数据返回一个片段.在我更新数据后,它假设显示我打电话notifyDataSetChanged
但没有任何反应.我DID覆盖getItemPosition
返回的方法POSITION_NONE
:
public static class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener,
ViewPager.OnPageChangeListener
{
private final Context mContext;
private final TabHost mTabHost;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private PagerTabsFragments fragmentDisplayInfo = null; // for now only a
// single size
// back
// stack
static class PagerTabsFragments
{
public int tabPosition;
public Fragment fragmentToDisplay;
public Object fragmentInfo;
public PagerTabsFragments(int tab, Fragment frag, Object info)
{
tabPosition = tab;
fragmentToDisplay …
Run Code Online (Sandbox Code Playgroud) android android-adapter fragmentpageradapter notifydatasetchanged
我正在为我的应用程序制作一个菜单,使用DrawerLayout和ArrayAdapter子类来实现看起来像Facebook的抽屉菜单.
我目前在创建列表时没有任何问题,但现在看起来不错,我想在不同类型的选项(即用户相关选项和应用程序相关选项)和菜单顶部的搜索栏之间添加分隔符.
我当前的ArrayAdaptor子类的代码如下:
public class DrawerMenuAdapter extends ArrayAdapter<String>{
private Context context;
private String[] values;
private int resId;
public DrawerMenuAdapter(Context context, int textViewResourceId, String[] values) {
super(context, textViewResourceId, values);
this.context = context;
this.values = values;
this.resId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(this.resId, parent, false);
TextView elementText = (TextView)rowView.findViewById(R.id.element_text);
ImageView elementImage = (ImageView)rowView.findViewById(R.id.element_icon);
String textValue = values[position];
elementText.setText(textValue);
//This switch adds the icons to the related …
Run Code Online (Sandbox Code Playgroud) android separator android-layout android-listview android-adapter
我有这个活动,它有一个片段.这个片段布局包含一个带有几个片段的视图寻呼机(实际上是两个片段).
创建视图寻呼机时,会创建其适配器,getItem
调用它并创建子片段.大.
现在,当我旋转屏幕时,框架处理片段重新创建,适配器在我onCreate
的主片段中再次创建,但getItem
永远不会被调用,因此我的适配器保存错误的引用(实际上为空)而不是两个片段.
我发现片段管理器(即子片段管理器)包含一个被调用的片段数组mActive
,当然这些片段无法从代码中访问.但是有这种getFragment
方法:
@Override
public Fragment getFragment(Bundle bundle, String key) {
int index = bundle.getInt(key, -1);
if (index == -1) {
return null;
}
if (index >= mActive.size()) {
throwException(new IllegalStateException("Fragement no longer exists for key "
+ key + ": index " + index));
}
Fragment f = mActive.get(index);
if (f == null) {
throwException(new IllegalStateException("Fragement no longer exists for key "
+ key + ": …
Run Code Online (Sandbox Code Playgroud) 我正在用ButterKnife
我的观点来约束我的观点ViewHolder
.我的代码如下:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<DataObject> data;
public MyAdapter(List<DataObject> data) {
this.data = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_layout, parent, false);
return new ViewHolder(view);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.row_header_view) View rowHeaderView;
@BindView(R.id.row_header_view_text) TextView headerTextView;
@BindView(R.id.row_data_view) View rowDataView;
@BindView(R.id.row_data_view_text) TextView rowDataTextView;
@BindView(R.id.row_data_view_detail_text) TextView rowDataDetailTextView;
public ViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我的ViewHolder
所有人BindView
都无所作为.它们都是空的.我可以肯定地证实他们在我的布局中.我的上述代码有什么问题?我已根据此处列出的文档使用它:
http://jakewharton.github.io/butterknife/#reset
还有什么需要吗?我正在使用ButterKnife …
data-binding android android-layout android-adapter butterknife
我延长了
RecyclerView.Adapter<RecyclerView.ViewHolder>
Run Code Online (Sandbox Code Playgroud)
当我打电话的时候:
mRecyclerView.getAdapter().notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
没啥事儿.
刷新视图的唯一方法是再次设置适配器(请参阅此答案):
mRecyclerView.setAdapter(new MyAdapter(...));
Run Code Online (Sandbox Code Playgroud)
这个解决方案有两个问题:
有任何想法吗?
android android-adapter notifydatasetchanged android-recyclerview
我有一个具有多个视图类型的视图.
onBindViewHolder
仅在getItemViewType
更改值时调用滚动.这会导致我的列表项无法正确更新.
这是一个错误吗?或者我在这里做错了什么.这似乎是新recyclerView
课程中非常奇怪的行为.
这是我的适配器:
package se.davison.smartrecycleradapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
/**
* Created by richard on 10/11/14.
*/
public class SectionAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = SectionAdapter.class.getSimpleName();
private final LayoutInflater inflater;
private final int sectionLayoutId;
private SparseIntArray positionSection;
private LinkedHashMap<AdapterItem, List<AdapterItem>> items = new LinkedHashMap<AdapterItem, List<AdapterItem>>();
private List<Class<? extends AdapterItem>> itemTypes = new ArrayList<Class<? extends …
Run Code Online (Sandbox Code Playgroud) android android-adapter android-support-library recycler-adapter android-recyclerview
我试图ViewHolder
在RecyclerView
没有重新绑定整个事情的情况下更新a .根据文档,我应该通过调用来执行此操作RecyclerView.Adapter.notifyItemChanged(int position, Object payload)
,其中payload
是一个将传递给的任意对象RecyclerView.Adapter.onBindViewHolder(VH holder, int position, List<Object> payloads)
,在那里我将能够更新ViewHolder.
但是当我尝试这个时,onBindViewHolder
总是收到一个空列表.在这两个调用之间,内部有效负载列表被清除.在RecyclerView的源代码中设置断点后,会发生这种情况,因为重新布局会最终调用RecyclerView.ViewHolder.clearPayload()
有没有其他人设法让这个工作?这是支持库中的错误还是我在触发这两个函数之间的重新布局时所做的事情?
这是清除有效负载时的堆栈跟踪:
"<1> main@831692616832" prio=5 runnable
java.lang.Thread.State: RUNNABLE
at android.support.v7.widget.RecyclerView$ViewHolder.clearPayload(RecyclerView.java:8524)
at android.support.v7.widget.RecyclerView$ViewHolder.resetInternal(RecyclerView.java:8553)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4544)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4461)
at android.support.v7.widget.LayoutState.next(LayoutState.java:86)
at android.support.v7.widget.StaggeredGridLayoutManager.fill(StaggeredGridLayoutManager.java:1423)
at android.support.v7.widget.StaggeredGridLayoutManager.onLayoutChildren(StaggeredGridLayoutManager.java:610)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2847)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3145)
at android.view.View.layout(View.java:14289)
at android.view.ViewGroup.layout(ViewGroup.java:4562)
at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:581)
at android.view.View.layout(View.java:14289)
at android.view.ViewGroup.layout(ViewGroup.java:4562)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:14289)
at android.view.ViewGroup.layout(ViewGroup.java:4562)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:14289)
at android.view.ViewGroup.layout(ViewGroup.java:4562)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:14289)
at android.view.ViewGroup.layout(ViewGroup.java:4562)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448) …
Run Code Online (Sandbox Code Playgroud) android android-adapter android-support-library android-recyclerview