我正在寻找一种滚动方式以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以将所选项目放在视图顶部?
我正在试验支持库的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
我试图通过位置获得儿童观点.单击一个项目时我可以查看:
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) 我想以编程方式单击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) 我在导航抽屉里面使用了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) 这可能看起来像一个重复的问题,但事实并非如此!
我在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) 我有一个 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) 我的活动显示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 包含项目,它不是空的。