相关疑难解决方法(0)

滚动RecyclerView以在顶部显示所选项目

我正在寻找一种滚动方式以RecyclerView在顶部显示所选项目的方法.

ListView我能够通过这样做,scrollTo(x,y)并获得了需要为中心元素的顶部.

就像是:

@Override
public void onItemClick(View v, int pos){
    mylistView.scrollTo(0, v.getTop());
}
Run Code Online (Sandbox Code Playgroud)

问题是RecyclerView当使用它的scrollTo方法时返回错误

RecyclerView不支持滚动到绝对位置

如何滚动a RecyclerView以将所选项目放在视图顶部?

android scroll android-recyclerview

192
推荐指数
12
解决办法
18万
查看次数

如何在RecyclerView中获取所选位置?

我正在试验支持库的recyclerview和卡片.我有回收卡的卡片.每张卡片的右上角都有一个"x"图标可将其删除:

该卡的xml, list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp">
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/taskDesc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:textSize="40sp"
        android:text="hi"/>
    <ImageView
        android:id="@+id/xImg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/ic_remove"/>
</RelativeLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)

我试图用我会在使用的位置标记的行notifyItemRemoved(position)TaskAdapter.java:

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder>  {

private List<Task> taskList;
private TaskAdapter thisAdapter = this;


// cache of views to reduce number of findViewById calls
public static class TaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    protected TextView taskTV;
    protected ImageView closeBtn;
    public TaskViewHolder(View v) {
        super(v); …
Run Code Online (Sandbox Code Playgroud)

android android-support-library android-cardview android-recyclerview

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

如何从RecyclerView获取子视图?

我试图通过位置获得儿童观点.单击一个项目时我可以查看:

rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            ((MainActivity) getActivity()).showSellRecordFragment(position, view);
        }
    }));
Run Code Online (Sandbox Code Playgroud)

现在我无法获得子视图,没有点击 - 例如,按位置说:

rvSellRecords.someMagicalMethodWhichReturnsViewByPosition(5);
Run Code Online (Sandbox Code Playgroud)

问题:如何从RecyclerView获取子视图?

编辑BOUNTY:

在此输入图像描述

RecyclerView要展示产品清单.当我点击它时,我正在添加新的片段,我在其中显示产品信息.打开时我正在用视图更新工具栏RecyclerView- 这完美地工作:

    rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        sellPresenter.onSellRecordSelected(position, view);
                    }
                }));

    When I click blue button with "+", I am incrementing quantity by 1.





    public void onIncrementButtonClicked(){
                sellRecord.setCount(sellRecord.getCount() + 1);
                showQuantity();
                bus.post(new SellRecordChangedEvent(sellRecord, sellRecordPosition));
                }

Then I am posting updated sellRecord …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview

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

Android recyclelerView findViewHolderForAdapterPosition返回null

我想以编程方式单击recyclerView中的项目,我找到了一种方法:

recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick();
Run Code Online (Sandbox Code Playgroud)

但它对我不起作用,findViewHolderForAdapterPosition只返回null.

我在代码中遗漏了什么吗?

HistoryListAdapter:

public class HistoryListAdapter extends RecyclerView.Adapter<HistoryListAdapter.ViewHolder> {
private static ArrayList<RecordItem> recordItems;
private static FragmentActivity activity;
private static RecordList recordList;

public HistoryListAdapter(ArrayList<RecordItem> recordItems, FragmentActivity FA, RecordList FRL) {
    this.recordItems = recordItems;
    this.activity = FA;
    this.recordList = FRL;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recorditem, parent, false);
    return new ViewHolder(itemLayoutView);
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
    // TextView …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview

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

Recyclerview,我无法通过getChildAt(位置)获取项目视图.空对象引用

我在导航抽屉里面使用了recyclerView,我正在使用这个库Twoway-view来获得点击和选择支持.

它工作得很好,我可以在每个位置的OnClick方法中更改文本和图标的颜色而没有问题:

itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
        @Override
        public void onItemClick(RecyclerView parent, View view, int position, long id) {
            TypedValue typedValue = new TypedValue();
            MainActivity.this.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true);
            final int color = typedValue.data;

            //TODO Icon and text colors

            for (int i = 0; i < drawerTitles.length; i++){
                if (i == position){
                    ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
                    TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
                    imageViewDrawerIcon.setColorFilter(color);
                    if(Build.VERSION.SDK_INT > 15){
                        imageViewDrawerIcon.setImageAlpha(255);
                    }else{
                        imageViewDrawerIcon.setAlpha(255);
                    }
                    textViewDrawerTitle.setTextColor(color);
                    RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
                    relativeLayoutDrawerItem.setFocusableInTouchMode(true);
                }else{
                    ImageView imageViewDrawerIcon = (ImageView) …
Run Code Online (Sandbox Code Playgroud)

android get-childitem android-recyclerview

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

检测到RecyclerView不一致.商品位置无效

这可能看起来像一个重复的问题,但事实并非如此!

我在RecyclerView上遇到了这种罕见的崩溃

java.lang.IndexOutOfBoundsException: 
Inconsistency detected. 
Invalid item position 1(offset:1).state:4 at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5014).
Run Code Online (Sandbox Code Playgroud)

我很确定在数据更改后我没有错过任何关于我的适配器的通知!

除了崩溃之外,我无法理解的一件事是我使用的是android.support.v7.widget.RecyclerView,崩溃是在那个java文件中的第5014行

来自RecyclerView.java的代码我的崩溃发生了

 if (offsetPosition < 0 || offsetPosition >= mAdapter.getItemCount()) {
            throw new IndexOutOfBoundsException("Inconsistency detected. Invalid item "
                    + "position " + position + "(offset:" + offsetPosition + ")."
                    + "state:" + mState.getItemCount());
        }
Run Code Online (Sandbox Code Playgroud)

所以这也要崩溃

offsetPosition < 0
Run Code Online (Sandbox Code Playgroud)

要么

offsetPosition >= mAdapter.getItemCount()
Run Code Online (Sandbox Code Playgroud)

从崩溃日志中可以清楚地看出,我的offsetPosition是1

offsetPosition >= mAdapter.getItemCount()
Run Code Online (Sandbox Code Playgroud)

一定是真的!! 但在我的适配器中,我实现了像这样的getItemCount

@Override
public int getItemCount() {
    return list.size() + 3;
}
Run Code Online (Sandbox Code Playgroud)

所以至少getItemCount应该返回3所以第二个语句也不可能是真的.

完整的崩溃日志

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 1(offset:1).state:4
                                     at …
Run Code Online (Sandbox Code Playgroud)

java android android-adapter android-recyclerview

5
推荐指数
0
解决办法
6346
查看次数

如何更新嵌套 recyclerview 项目的项目?

我有一个 recyclerview(parent),在片段中填充了一些 recyclerviews(child),我想使用操作(例如单击操作)直接从片段更新每个嵌套的 recyclerviews(child),我该如何在完美且高效的方式?

初始父适配器

     ParentAdapter adapter = new ParentAdapter(dataSet);
     mBinding.recyclerView.setAdapter(adapter);

Run Code Online (Sandbox Code Playgroud)

父适配器.java

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> {

    private final RecyclerView.RecycledViewPool viewPool;
    private List<CartItemCategory> dataSet;

    public MainAdapter(List<CartItemCategory> dataSet) {

        this.dataSet = dataSet;
        
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ShoppingCardParentItemLayoutBinding mBinding = ShoppingCardParentItemLayoutBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new ViewHolder(mBinding);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.mBinding.setCartItemCategory(dataSet.get(position));

        ChildAdapter childAdapter = new ChildAdapter(dataSet.get(position).getCartItems());
        holder.mBinding.recyclerView.setHasFixedSize(true);
        holder.mBinding.recyclerView.setAdapter(childAdapter);
        holder.mBinding.recyclerView.setRecycledViewPool(viewPool);
    }

    @Override
    public int getItemCount() {
        return dataSet.size();
    } …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview nestedrecyclerview

5
推荐指数
1
解决办法
3944
查看次数

LinearLayoutManager.findViewByPosition() 返回 null

我的活动显示RecyclerView带有LinearLayoutManager. 我想获取View列表中的第一项 ( )。根据这篇文章接受的答案,我可以调用LinearLayoutManager.findViewByPosition()方法,但我得到了null。为什么?

RecyclerView list = findViewById(R.id.list);
LinearLayoutManager llm = new LinearLayoutManager(this);
list.setLayoutManager(llm);
MyAdapter adapter = new MyAdapter();
list.setAdapter(adapter);
View firstViewItem = llm.findViewByPosition(0); // <-- null
Run Code Online (Sandbox Code Playgroud)

adapter 包含项目,它不是空的。

android android-recyclerview linearlayoutmanager

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