标签: android-recyclerview

在Android中使用notifyItemRemoved或notifyDataSetChanged与RecyclerView

我正在创建一个使用RecyclerView显示的卡片列表,其中每张卡片都有一个按钮,可以从列表中删除该卡片.

当我使用notifyItemRemoved()删除RecyclerView中的卡时,它会删除项目和动画,但列表中的数据未正确更新.

如果不是这样,我切换到notifyDataSetChanged()然后列表中的项目被删除并正确更新,但然后卡片不动画.

有人有使用notifyItemRemoved()的经验,并知道为什么它的行为与notifyDataSetChanged不同?

以下是我正在使用的一些代码:

private List<DetectedIssue> issues = new ArrayList<DetectedIssue>();

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    if(position >0){
        RiskViewHolder riskHolder = (RiskViewHolder)holder;
        final int index = position - 1;
        final DetectedIssue anIssue = issues.get(index);

        riskHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    int index = issues.indexOf(anIssue);
                    issues.remove(anIssue);
                    notifyItemRemoved(index);

                    //notifyDataSetChanged(); …
Run Code Online (Sandbox Code Playgroud)

android android-listview notifydatasetchanged android-recyclerview

67
推荐指数
4
解决办法
4万
查看次数

为什么在RecyclerView.Adapter的onBindViewHolder中添加OnClickListener被认为是不好的做法?

我有一个RecyclerView.Adapter类的以下代码,它工作正常:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Viewholder> {

    private List<Information> items;
    private int itemLayout;

    public MyAdapter(List<Information> items, int itemLayout){
        this.items = items;
        this.itemLayout = itemLayout;
    }

    @Override
    public Viewholder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);
        return new Viewholder(v);
    }

    @Override
    public void onBindViewHolder(Viewholder holder, final int position) {
        Information item = items.get(position);
        holder.textView1.setText(item.Title);
        holder.textView2.setText(item.Date);

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), "Recycle Click" + position, Toast.LENGTH_SHORT).show();
            }
        });

       holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { …
Run Code Online (Sandbox Code Playgroud)

java performance android android-recyclerview

67
推荐指数
4
解决办法
3万
查看次数

检测RecyclerView在滚动时何时到达最底部位置

我有一个RecyclerView的代码.

    recyclerView = (RecyclerView)rootview.findViewById(R.id.fabric_recyclerView);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.addItemDecoration(new RV_Item_Spacing(5));
    FabricAdapter fabricAdapter=new FabricAdapter(ViewAdsCollection.getFabricAdsDetailsAsArray());
    recyclerView.setAdapter(fabricAdapter);
Run Code Online (Sandbox Code Playgroud)

我需要知道RecyclerView在滚动时何时到达最底部位置.可能吗 ?如果有,怎么样?

android scroll android-recyclerview

65
推荐指数
8
解决办法
5万
查看次数

RecyclerView存储/恢复活动之间的状态

我正在将ListViews迁移到RecyclerViews.使用listviews,我使用此处描述的常用技术来存储和恢复活动之间的滚动位置.

如何使用RecyclerViews做同样的事情?在RecyclerView.onSaveInstanceState()似乎有protected访问权限,因此无法直接使用.

android listview android-recyclerview

64
推荐指数
4
解决办法
6万
查看次数

在RecyclerView中保存EditText内容

我有列表项目EditText,我不知道会有多少项目.当我输入一些文本时EditText,我有一个问题,然后向下滚动RecyclerView,在我再次向上滚动后,我的第一个没有文字EditText.

我想知道什么,我应该在哪里编写代码,以便在用户输入或完成输入时(我想用a做TextWatcher)在EditText文本中保存到文件中(我将它保存在一个文件中).外部存储中的txt文件)

我应该onCreate在活动方法或适配器类或其他地方这样做吗?

这是一些代码

主要活动代码

 public class MainActivity extends Activity {

    RecyclerView mRecyclerView;
    MyAdapter mAdapter;
    String[] mDataSet= new String[20];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // generating text for editText Views
        for (int i = 0; i<=19; i++){
        mDataSet[i]= "EditText n: "+i;

    }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mAdapter = new MyAdapter(mDataSet);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setHasFixedSize(true);
    }
Run Code Online (Sandbox Code Playgroud)

我的适配器代码

public class MyAdapter …
Run Code Online (Sandbox Code Playgroud)

android android-edittext android-recyclerview

64
推荐指数
4
解决办法
5万
查看次数

使用com.android.support时找不到attr/colorError错误:recyclerview-v7:26.0.0-beta2

我正在使用Android Studio 3.0 Canary 4.我导入了回收站视图库.然后它出现attr/colorError not found消息.这是app build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.robyn.myapplication"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support:recyclerview-v7:26.0.0-beta2'
    implementation 'com.android.support:appcompat-v7:26.0.0-beta2'
}
Run Code Online (Sandbox Code Playgroud)

每当我添加两个库实现'com.android.support:recyclerview-v7:26.0.0-beta2'并实现'com.android.support:appcompat-v7:26.0.0-beta2'时,它会出现此错误消息: 在此输入图像描述

我试过干净并重建,错误信息仍然存在.我检查了res/values/colors,颜色值在那里.为什么我会出现这种颜色错误?如果我想使用recycler视图,我应该导入哪个版本的库?

android gradle android-recyclerview

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

RecyclerView Adapter中静态和非静态视图的区别是什么?

这种方法的优点是什么(在我的类MyAdapter中使用静态嵌套类扩展了RecyclerView.Adapter):

static class MyVH extends RecyclerView.ViewHolder {...}
Run Code Online (Sandbox Code Playgroud)

而这种方法(使用成员内部类):

  class MyVH extends RecyclerView.ViewHolder {...}
Run Code Online (Sandbox Code Playgroud)

或者它不会影响性能,可以使用这两种方法吗?

static android android-viewholder android-recyclerview

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

用于RecyclerView的GridLayoutManager上的方形布局

我尝试使用方形图像制作网格布局.我认为必须有可能GridLayoutManager通过操纵onMeasure来操纵

super.onMeasure(recycler, state, widthSpec, widthSpec); 
Run Code Online (Sandbox Code Playgroud)

代替

super.onMeasure(recycler, state, widthSpec, heightSpec);
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这没有用.

有任何想法吗?

android gridlayoutmanager android-recyclerview

60
推荐指数
5
解决办法
3万
查看次数

RecyclerView中的单一选择

我知道在recyclerview类中没有默认的选择方法,但是我试过以下方式,

public void onBindViewHolder(ViewHolder holder, final int position) {
    holder.mTextView.setText(fonts.get(position).getName());
    holder.checkBox.setChecked(fonts.get(position).isSelected());

    holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked) {
                for (int i = 0; i < fonts.size(); i++) {
                    fonts.get(i).setSelected(false);
                }
                fonts.get(position).setSelected(isChecked);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

尝试这段代码时,我得到了预期的输出,但完全没有.

我将用图像解释这个.

默认情况下,从我的适配器中选择第一个项目

在此输入图像描述

然后我试图选择第二个然后是第三个,然后是第四个,最后是第五个,

在此输入图像描述

这里仅应选择第5个,但所有5个都被选中.

如果我将列表滚动到底部并再次返回顶部,

在此输入图像描述

我得到了我的预期,

我怎样才能克服这个问题?还有一段时间如果我快速滚动列表,其他一些项目就会被选中.如何克服这个问题呢?

更新

notifyDataSetChanged()fonts.get(position).setSelected(isChecked);我得到以下异常后,我正在尝试使用

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
        at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:1462)
        at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:2982)
        at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:7493)
        at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:4338)
        at com.app.myapp.screens.RecycleAdapter.onRowSelect(RecycleAdapter.java:111)
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview

60
推荐指数
7
解决办法
8万
查看次数

在RecyclerView上删除项目时没有动画

我是RecyclerView第一次使用.一切都工作正常,除了项目删除没有动画,即使项目添加动画工作正常.

我没有设置任何自定义项动画师,但根据文档:

默认情况下,启用添加和删除项目的动画RecyclerView.

所以关于删除的动画应该有效.

我希望删除默认动画,但无法使其工作.

这就是我设置RecyclerView的方法:

private void setupRecyclerView() {
  mRecyclerView = (RecyclerView) mRootView.findViewById(R.id.recycler_view);
  mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
  View emptyView = mRootView.findViewById(R.id.empty_view);
  mAdapter = new RoutineAdapter(getActivity(), mRoutineItems, emptyView);
  mRecyclerView.setAdapter(mAdapter);
}
Run Code Online (Sandbox Code Playgroud)

这是我的适配器:

private class RoutineAdapter
      extends RecyclerView.Adapter<RoutineAdapter.ViewHolder> {

private final Context mContext;
private List<RoutineItem> mData;
private View mEmptyView;

    public RoutineAdapter(Context context, List<RoutineItem> data, View emptyView) {
      mContext = context;
      mData = data;
      mEmptyView = emptyView;
      setEmptyViewVisibility();
    }

    public void add(RoutineItem routineItem, int position) {
      mData.add(position, routineItem);
      setEmptyViewVisibility(); …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview

59
推荐指数
6
解决办法
4万
查看次数