Android 如何更新RecylerView适配器中的数据
我有一个recyclerview适配器,其中每个视图都有一个按钮。我想实现一个fuc=n可选性,这样,如果我单击任何视图上的按钮,则应更新recyclerview的所有视图。如何做到这一点? 这就是我在onBindViewHolder中所做的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
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上,下面的语句可能是相反的意思:notstories.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的标记并将其设置为与之相对。