标签: android-adapter

getAdapterPosition() 已弃用

我已将我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)

android android-adapter android-recyclerview

39
推荐指数
1
解决办法
9103
查看次数

Android:如何刷新ListView内容?

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)

android listview android-adapter

38
推荐指数
3
解决办法
14万
查看次数

不调用自定义适配器getView()方法

这是片段的代码,我在其中为列表设置自定义适配器.

没有错误,但是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)

android android-adapter

36
推荐指数
2
解决办法
5万
查看次数

FragmentPagerAdapter notifyDataSetChanged不起作用

我有一个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

34
推荐指数
3
解决办法
2万
查看次数

如何将段分隔符/分隔符添加到ListView?

我正在为我的应用程序制作一个菜单,使用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

33
推荐指数
2
解决办法
7万
查看次数

如何使用ViewPager和嵌套片段正确处理屏幕旋转?

我有这个活动,它有一个片段.这个片段布局包含一个带有几个片段的视图寻呼机(实际上是两个片段).

创建视图寻呼机时,会创建其适配器,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)

android android-adapter android-fragments android-viewpager

30
推荐指数
3
解决办法
1万
查看次数

RecyclerView.ViewHolder无法使用ButterKnife绑定视图

我正在用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

28
推荐指数
2
解决办法
2万
查看次数

RecyclerView适配器notifyDataSetChanged无法正常工作

我延长了

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)

这个解决方案有两个问题:

  1. 当我再次设置适配器时,我可以看到屏幕上闪烁
  2. 列表视图返回第一个位置.

有任何想法吗?

android android-adapter notifydatasetchanged android-recyclerview

27
推荐指数
2
解决办法
3万
查看次数

仅在getItemViewType更改时才调用RecyclerView onBindViewHolder

我有一个具有多个视图类型的视图.

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

26
推荐指数
2
解决办法
3万
查看次数

RecyclerView.Adapter.notifyItemChanged()永远不会将有效负载传递给onBindViewHolder()

我试图ViewHolderRecyclerView没有重新绑定整个事情的情况下更新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

26
推荐指数
2
解决办法
2万
查看次数