Android 如何更新RecylerView适配器中的数据

Android 如何更新RecylerView适配器中的数据,android,android-recyclerview,android-adapter,Android,Android Recyclerview,Android Adapter,我有一个recyclerview适配器,其中每个视图都有一个按钮。我想实现一个fuc=n可选性,这样,如果我单击任何视图上的按钮,则应更新recyclerview的所有视图。如何做到这一点? 这就是我在onBindViewHolder中所做的 public class StoryItemAdapter extends RecyclerView.Adapter<StoryItemAdapter.ViewHolder> { LayoutInflater inflater; Conte

我有一个recyclerview适配器,其中每个视图都有一个按钮。我想实现一个fuc=n可选性,这样,如果我单击任何视图上的按钮,则应更新recyclerview的所有视图。如何做到这一点? 这就是我在onBindViewHolder中所做的

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

LayoutInflater inflater;
Context context;
Bitmap bm;
ImageLoader imloader;
static ArrayList<StoryDetails> stories;


OnItemClickListener mItemClickListener;
public StoryItemAdapter(Context context,ArrayList<StoryDetails> stories) {
    this.context = context;
    this.stories = stories;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imloader = ImageLoader.getInstance();
    imloader.init(ImageLoaderConfiguration.createDefault(context));


}

@Override
public long getItemId(int position) {

    return 0;
}

@Override
public int getItemCount() {

    return stories != null ? stories.size() : 0;
}

@SuppressWarnings("deprecation")
@Override
public void onBindViewHolder(ViewHolder holder, int position) {


    if(stories.get(position).getType()==null) {
        holder.user_handle.setText(stories.get(position).getUsername() + "( " + stories.get(position).getHandle() + " )");

        File file = imloader.getDiscCache().get(stories.get(position).getImage());
        if (!file.exists()) {
            DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .cacheOnDisc()
                    .build();
            imloader.displayImage(stories.get(position).getImage(), holder.image, options);
        } else {
            holder.image.setImageURI(Uri.parse(file.getAbsolutePath()));
        }

        holder.about.setText(stories.get(position).getAbout());
        holder.followers.setText("Followers\n\r" + stories.get(position).getFollowers());
        holder.following.setText("Following\n\r" + stories.get(position).getFollowing());
    }
    else
    {
        holder.user_handle.setText(stories.get(position).getTitle());

        File file = imloader.getDiscCache().get(stories.get(position).getSi());
        if (!file.exists()) {
            DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .cacheOnDisc()
                    .build();
            imloader.displayImage(stories.get(position).getSi(), holder.image, options);
        } else {
            holder.image.setImageURI(Uri.parse(file.getAbsolutePath()));
        }

        holder.about.setText(stories.get(position).getDescription());
        holder.followers.setText("Likes \n\r" + stories.get(position).getLikes_count());
        holder.following.setText("Comments \n\r" + stories.get(position).getComment_count());


    }

    if(stories.get(position).getIs_following())
    {
        holder.follow.setText("Following");
    }
    else
        holder.follow.setText("Follow");

    final int  p = position;
    final ViewHolder h = holder;

    holder.follow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(stories.get(p).getIs_following())
            {
                stories.get(p).setIs_following(false);
                h.follow.setText("Follow");


            }
            else {
                stories.get(p).setIs_following(true);
                h.follow.setText("Following");
            }


            for(int i =0;i <stories.size();i++) {
                if (stories.get(p).getDb() != null) {

                    if(stories.get(p).getDb().equals(stories.get(i).getId()))
                    {
                        stories.get(p).setIs_following(stories.get(i).getIs_following());

                    }


                }
            }



        }
    });


}



@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.story_adapter, viewGroup,
            false);
    return new ViewHolder(itemView);

}


public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    ImageView image;
    TextView user_handle, about, followers,following,userSince;
    Button follow;


    public ViewHolder(View itemView) {
        super(itemView);
        user_handle = (TextView) itemView.findViewById(R.id.user_handle);
        about = (TextView) itemView.findViewById(R.id.about);
        followers = (TextView) itemView.findViewById(R.id.followers);
        following = (TextView) itemView.findViewById(R.id.following);
       // userSince = (TextView) itemView.findViewById(R.id.user_since);
        image = (ImageView) itemView.findViewById(R.id.user_image);
        follow =(Button) itemView.findViewById(R.id.follow);



        RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);

        image.setLayoutParams(rlp);
        image.setAdjustViewBounds(true);
        image.setScaleType(ImageView.ScaleType.FIT_CENTER);

        itemView.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {



        if (mItemClickListener != null) {
            mItemClickListener.onItemClick(v, getPosition());
        }
    }

}

public interface OnItemClickListener {
    public void onItemClick(View view , int position);
}

public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
    this.mItemClickListener = mItemClickListener;
}
公共类StoryItemAdapter扩展了RecyclerView.Adapter{
充气机;
语境;
位图bm;
图像加载器;
静态数组列表故事;
OnItemClickListener mItemClickListener;
公共StoryItemAdapter(上下文、ArrayList故事){
this.context=上下文;
这个故事=故事;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
imloader=ImageLoader.getInstance();
init(ImageLoaderConfiguration.createDefault(上下文));
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
public int getItemCount(){
返回故事!=null?故事。大小():0;
}
@抑制警告(“弃用”)
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
if(stories.get(position.getType()==null){
holder.user_handle.setText(stories.get(position.getUsername()+)(“+stories.get(position.getHandle()+”));
File File=imloader.getDiscCache().get(stories.get(position.getImage());
如果(!file.exists()){
DisplayImageOptions=new DisplayImageOptions.Builder()
.cacheOnDisc()
.build();
displayImage(stories.get(position.getImage(),holder.image,options);
}否则{
holder.image.setImageURI(Uri.parse(file.getAbsolutePath());
}
holder.about.setText(stories.get(position.getAbout());
holder.followers.setText(“followers\n\r”+stories.get(position.getFollowers());
holder.following.setText(“following\n\r”+stories.get(position.getFollowing());
}
其他的
{
holder.user_handle.setText(stories.get(position.getTitle());
File File=imloader.getDiscCache().get(stories.get(position.getSi());
如果(!file.exists()){
DisplayImageOptions=new DisplayImageOptions.Builder()
.cacheOnDisc()
.build();
displayImage(stories.get(position.getSi(),holder.image,options);
}否则{
holder.image.setImageURI(Uri.parse(file.getAbsolutePath());
}
holder.about.setText(stories.get(position.getDescription());
holder.followers.setText(“Likes\n\r”+stories.get(position.getLikes_count());
holder.following.setText(“Comments\n\r”+stories.get(position.getComment\u count());
}
if(stories.get(position.getIs_following())
{
holder.follow.setText(“follow”);
}
其他的
holder.follow.setText(“follow”);
最终INTP=位置;
最终视图支架h=支架;
holder.follow.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(stories.get(p.getIs_following())
{
故事。get(p)。setIs_following(false);
h、 follow.setText(“follow”);
}
否则{
故事。获取(p)。设置为跟随(真);
h、 follow.setText(“follow”);
}

对于(inti=0;i,您需要将任何数据集更改通知适配器

试试这个

 holder.follow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(stories.get(p).getIs_following())
            {
                stories.get(p).setIs_following(false);
                h.follow.setText("Follow");


            }
            else {
                stories.get(p).setIs_following(true);
                h.follow.setText("Following");
            }


            for(int i =0;i <stories.size();i++) {
                if (stories.get(p).getDb() != null) {

                    if(stories.get(p).getDb().equals(stories.get(i).getId()))
                    {
                        stories.get(p).setIs_following(stories.get(i).getIs_following());

                    }


                }
            }
            notifyDataSetChanged();

        }
holder.follow.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(stories.get(p.getIs_following())
{
故事。get(p)。setIs_following(false);
h、 follow.setText(“follow”);
}
否则{
故事。获取(p)。设置为跟随(真);
h、 follow.setText(“follow”);
}

对于(int i=0;i@naveentamakar updated),我认为您需要:RecyclerView.getChildAt(int index)…更多提示=>从OnClick可以调用另一个方法updateMyViews(),并在这个循环中通过所有索引值(直到arraylist大小),使用上述函数获取视图并更新它们。如果需要,稍后调用notifyDataSetChange()在Adapter上,下面的语句可能是相反的意思:not
stories.get(p).setIs_following(stories.get(i).getIs_following());
但是
stories.get(i).setIs_following(stories.get(p).getIs_following());
?否则之前为stories.get(p)设置“following/following”值没有意义正如0X0nosugar指出的=>代码中有一个小错误。for循环故事的内部。get(p)必须是故事。get(i)我注意到的另一个逻辑故障是,为什么您甚至需要for循环,OnClick只会更改一个项值(如下所示)对于故事列表中的单个项目,那么您只需要更新数据库中的1个值,为什么要更新故事列表中的每个项目?一种方法是在单击时标记每个textViewObject中的值,然后调用notifyDataSetChanged(),这将再次调用OnBindViewHolder()回调,在那里您可以获取该textView的标记并将其设置为与之相对。