Android 如何在回收器视图中动态更改项目视图?
我正在写音乐播放器与曲目列表在回收视图。我想更改已单击项目中的图像视图。试图使用getItemViewType,但据我所知,它只设置了一次视图类型。这是我的密码:Android 如何在回收器视图中动态更改项目视图?,android,android-recyclerview,Android,Android Recyclerview,我正在写音乐播放器与曲目列表在回收视图。我想更改已单击项目中的图像视图。试图使用getItemViewType,但据我所知,它只设置了一次视图类型。这是我的密码: public class TrackListAdapter extends RecyclerView.Adapter<TrackListAdapter.RegularViewHolder> implements IntConstants{ private ArrayList<Track> trackList;
public class TrackListAdapter extends RecyclerView.Adapter<TrackListAdapter.RegularViewHolder> implements IntConstants{
private ArrayList<Track> trackList;
private Context context;
int selectedPos = -1;
public TrackListAdapter(ArrayList<Track> trackList, Context context) {
this.trackList = trackList;
this.context = context;
EventBus.getDefault().register(this);
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
EventBus.getDefault().unregister(this);
super.onDetachedFromRecyclerView(recyclerView);
}
@Override
public RegularViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
if (viewType == ITEM_TYPE_PLAYING){
//here i am sending xml for clicked item
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.playing_track_item, parent, false);
return new RegularViewHolder(itemView) ;
}else {
//here i'm sending xml for regular item
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.regular_track_item, parent, false);
return new RegularViewHolder(itemView) ;
}
}
@Override
public void onBindViewHolder(final RegularViewHolder holder, int position) {
Track t = trackList.get(position);
holder.textTrackTitle.setText(t.getTitle());
holder.textTrackAlbum.setText(t.getAlbum());
holder.textTrackArtist.setText(t.getArtist());
holder.parent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEvent(TRACK_CLICKED_ACTION_CODE, holder.getAdapterPosition()));
}
});
}
@Override
public int getItemCount() {
return trackList.size();
}
class RegularViewHolder extends RecyclerView.ViewHolder{
ImageView imageAlbumArt;
TextView textTrackTitle, textTrackArtist, textTrackAlbum;
RelativeLayout parent;
private RegularViewHolder(View itemView){
super(itemView);
parent = (RelativeLayout)itemView.findViewById(R.id.item_parent);
imageAlbumArt = (ImageView)itemView.findViewById(R.id.image_album_art);
textTrackTitle = (TextView) itemView.findViewById(R.id.text_track_title);
textTrackArtist = (TextView) itemView.findViewById(R.id.text_track_artist);
textTrackAlbum = (TextView) itemView.findViewById(R.id.text_track_album);
}}
@Override
public int getItemViewType(int position) {
if (position == selectedPos){
return ITEM_TYPE_PLAYING;
}else {
return ITEM_TYPE_REGULAR;
}
}
@Subscribe
public void handleTrack(MessageEvent event){
if (event.getCode() == TRACK_SELECTED_ACTION_CODE){
selectedPos = event.getPosition();
}
}
}您必须更新适配器存储的选定位置,然后两次更改NotifyItem,以更新以前选定的旧项目和现在选定的新项目的位置。是否要更新适配器中项目的位置?我现在已经这样做了,但当我点击任何项目时,它正在更新列表中的第一个项目将代码更改为:EventBus.getDefault.postnew MessageEventTRACK\u CLICKED\u ACTION\u code,position;请在单击侦听器后发布代码。你在改变你的视图类型吗?@YusufAbdullaev那么你可能在通知错误的位置