Android RecyclerView-滚动更改项 [英] Android RecyclerView - scrolling changes items
问题描述
我有一个带有线性布局管理器的recyclerview,它包含不同的项目.其中一个项目具有隐藏或显示此项目的嵌套布局的按钮.
因此,我添加了类似特定类型的10行的内容,当我单击特定项目时,将显示它的嵌套布局,但是我看到另一个项目显示了它自己的嵌套布局.第二种尝试是单击某些按钮并滚动,嵌套布局显示在其他项目上.
从代码中可以看到,我尝试调用方法-notifyDataSetChanged(),但是它没有帮助.我知道这里有扩展的回收站视图,但就我而言,我想在不更改整个代码的情况下解决它.
布局:
< RelativeLayoutandroid:layout_height ="wrap_content"android:layout_width ="wrap_content">< TextViewandroid:id ="@ + id/tv"android:layout_height ="wrap_content"android:layout_width ="wrap_content"android:text =单击按钮"/><按钮android:id ="@ + id/btn"android:layout_width ="wrap_content"android:layout_height ="wrap_content"android:text =点击我"android:layout_toRightOf ="@ + id/tv"/>< RelativeLayoutandroid:id ="@ + id/嵌套"android:layout_width ="wrap_content"android:layout_height ="wrap_content"android:layout_below ="@ + id/tv"android:visibility ="gone">< TextViewandroid:id ="@ + id/tv1"android:layout_height ="wrap_content"android:layout_width ="wrap_content"android:text =单击按钮"/></RelativeLayout></RelativeLayout>
适配器中的代码(onBind)
@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder持有人,最终的int位置){int类型= getItemViewType(位置);ViewType viewType = ViewType.values()[type];尝试{开关(viewType){案例VIEW1://视图1的代码休息;案例VIEW2:最终的ViewHolder viewHolder =(ViewHolder)持有人;viewHolder.tv.setText("TV1");viewHolder.btn.setOnClickListener(new View.OnClickListener(){@Override公共无效的onClick(View v){viewHolder.nestedLayout.setVisibility(!isVisible?View.VISIBLE:View.GONE);viewHolder.isVisible =!viewHolder.isVisible;//notifyDataSetChanged();}});休息;}}捕获(异常e){e.printStackTrace();Log.d("ChatListAdapter",聊天列表适配器ioexception" + e.getMessage());}}
如Samuel Robert所指出的,您需要跟踪模型类中扩展项目的可见性:
假设您使用的是模型类项目,则在其中有一个字段来跟踪嵌套布局的可见性.
尝试一下:
Item item = itemList.get(position);最终的ViewHolder viewHolder =(ViewHolder)持有人;viewHolder.tv.setText("TV1");viewHolder.nestedLayout.setVisibility(!item.isVisible?View.VISIBLE:View.GONE);viewHolder.btn.setOnClickListener(new View.OnClickListener(){@Override公共无效的onClick(View v){int position = getAdapterPosition();if(position!= RecyclerView.NO_POSITION){项目item = itemList.get(位置)item.isVisible =!item.isVisible;notifyItemChanged(position);}}});
I have a recyclerview with linear layout manager and it contains different items. one of the items have a button that hides or display the nested layout of this items.
So I added something like 10 rows of the specific type, and when I click on specific item, it's nested layout is displayed, but I see that another item display it's own nested layout. Second try was to click on some button and scrolling, the nested layout was shown on a different items.
As you can see from the code, I tried to call the method - notifyDataSetChanged(), but it doesn't help. I know that there is expanded recycler view, but In my case I want to solve it without change the whole code..
The layout:
<RelativeLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView
android:id = "@+id/tv"
android:layout_height="wrap_content"
android:layout_width = "wrap_content"
android:text = "click on the button"
/>
<Button
android:id = "@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me"
android:layout_toRightOf="@+id/tv"
/>
<RelativeLayout
android:id = "@+id/nested"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv"
android:visibility="gone"
>
<TextView
android:id = "@+id/tv1"
android:layout_height="wrap_content"
android:layout_width = "wrap_content"
android:text = "click on the button"
/>
</RelativeLayout>
</RelativeLayout>
The code in the adapter (onBind)
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position)
{
int type = getItemViewType(position);
ViewType viewType = ViewType.values()[type];
try
{
switch (viewType)
{
case VIEW1:
// code for view 1
break;
case VIEW2:
final ViewHolder viewHolder = (ViewHolder) holder;
viewHolder.tv.setText("TV1");
viewHolder.btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
viewHolder.nestedLayout.setVisibility(!isVisible ? View.VISIBLE : View.GONE );
viewHolder.isVisible = !viewHolder.isVisible;
// notifyDataSetChanged();
}
});
break;
}
}
catch (Exception e)
{
e.printStackTrace();
Log.d("ChatListAdapter","chat list adapter ioexception" + e.getMessage());
}
}
As pointed out by Samuel Robert, you need to track the expanded items visibility in your model class :
Say you are using a model class item, have a field inside it to track the visibility of nested layout.
Try this out :
Item item = itemList.get(position);
final ViewHolder viewHolder = (ViewHolder) holder;
viewHolder.tv.setText("TV1");
viewHolder.nestedLayout.setVisibility(!item.isVisible ? View.VISIBLE : View.GONE );
viewHolder.btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
int position = getAdapterPosition();
if( position != RecyclerView.NO_POSITION ) {
Item item = itemList.get(position)
item.isVisible = !item.isVisible;
notifyItemChanged(position);
}
}
});
这篇关于Android RecyclerView-滚动更改项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!