【问题标题】:How to update data in RecyclerView on android如何在 Android 上更新 RecyclerView 中的数据
【发布时间】:2017-12-30 23:49:40
【问题描述】:

我想为一个站点开发 android 应用程序。对于加载数据,我使用RecyclerView,当用户滑动 Recyclerview 更新数据时我想要。我写了这段代码,但我不知道写更新代码并在onRefresh方法中使用!
我的适配器代码:

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

    private List<MainDataModel> mDateSet;
    private Context mContext;

    public MainAdapter(Context context) {
        this.mContext = context;
        this.mDateSet = new ArrayList<>();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(mContext).inflate(R.layout.post_card_layout, parent, false);
        return new ViewHolder(view);
    }

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

        holder.main_post_title.setText(mDateSet.get(position).getTitle());
        Glide.with(mContext)
                .load(mDateSet.get(position).getThumbnail())
                .placeholder(R.drawable.post_image)
                .into(holder.main_post_image);
    }

    @Override
    public int getItemCount() {
        return mDateSet.size();
    }

    public void remove(int position){
        mDateSet.remove(position);
        notifyItemRemoved(position);
    }

    public void add(List<MainDataModel> models){
        mDateSet.addAll(models);
        notifyDataSetChanged();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private TextView main_post_title;
        private ImageView main_post_image;
        public ViewHolder(View itemView) {
            super(itemView);

            main_post_title = (TextView) itemView.findViewById(R.id.post_content_title);
            main_post_image = (ImageView) itemView.findViewById(R.id.post_picture_image);
        }
    }
}

主要活动代码:

public class Main_page extends AppCompatActivity {

    private static final long RIPPLE_DURATION = 250;
    private Toolbar toolbar;
    private RelativeLayout root;
    private ImageView menu_image;
    private SuperRecyclerView main_recyclerView;
    private MainAdapter mAdaper;
    private List<MainDataModel> dataModels;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page);
        if (!EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().register(this);
        }

        toolbar = (Toolbar) findViewById(R.id.main_toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setTitle(null);
        }
        // RecyclerView and setData
        main_recyclerView = (SuperRecyclerView) findViewById(R.id.main_recycler);
        //main_recyclerView.setHasFixedSize(true);
        main_recyclerView.setLayoutManager(new LinearLayoutManager(this));

        MainDataInfo dataInfo = new MainDataInfo();
        dataInfo.getMainDataInfo(this);

        mAdaper = new MainAdapter(this);
        main_recyclerView.setAdapter(mAdaper);

        main_recyclerView.setupMoreListener(new OnMoreListener() {
            @Override
            public void onMoreAsked(int overallItemsCount, int itemsBeforeMore, int maxLastVisiblePosition) {

            }
        }, 3);

        main_recyclerView.setRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh () {

            }});
    }

    @Subscribe
    public void onEvent(List<MainDataModel> mainInfoModels) {
        mAdaper.add(mainInfoModels);
    }
}

如何在Adapter中编写update方法并使用onRefresh方法?

注意:请不要给我负分,我是业余爱好者,我真的需要你!谢谢大家

【问题讨论】:

  • 我不知道滑动刷新,但是当你弄清楚你可以再次调用适配器构造函数。

标签: android android-recyclerview


【解决方案1】:

我建议你开始做几件事来让你的 RecyclerView 工作:

  1. 将 List 变量放入 Activity 并管理通过 Activity 从适配器中添加和删除的内容。
  2. 通过适配器的构造函数将列表传递给适配器。
  3. 每当您从列表中更改/添加/删除内容时,请使用mAdapter.notifyItemChanged(...)mAdapter.notifyItemInserted(...)mAdapter.notifyItemRemoved(...)。这些会导致关联的 ViewHolder 重新绑定其视图数据。

所以您的代码应该如下所示:
Activity

// I recommend calling this class MainPageActivity instead for consistency's sake
public class Main_page extends AppCompatActivity {
    MainAdapter mAdapter;
    List<MainDataModel> mItems = new ArrayList<MainDataModel>();
    // Use this to change an item in the list
    public void setItem(int index,MainDataModel item)
    {
        mItems.set(index, item);
        mAdapter.notifyItemChanged(index);
    }
    // Use this to add an item
    public void addItem(MainDataModel item)
    {
        mItems.add(item);
        mAdapter.notifyItemInserted(mItems.size() - 1);
    }
    // Use this to remove an item
    public void removeItem(int index)
    {
        mItems.remove(index);
        mAdapter.notifyItemRemoved(index);
    }
    // ... The rest of your code
}

适配器

class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder>
{
    private Context mContext;
    private List<MainDataModel> mDateSet;
    public MainAdapter(Context context, List<MainDataModel> dataSet)
    {
        this.mContext = context;
        this.mDataSet = dataSet;
    }
    // ... The rest of your code
}

【讨论】:

  • 嗯...好吧,这完全取决于您决定要使用 onRefresh 方法做什么。通常你要做的是调用mItems.clear() & mAdapter.notifyDataSetChanged(),然后通过我之前谈到的addItem(...) 方法将新项目添加到列表中。
  • 或者,如果您只想刷新 ViewHolders 而不是与适配器关联的项目列表的数据,只需调用 mAdapter.notifyDataSetChanged() 自己,没有别的。
【解决方案2】:

您只需更改数据集中的项目并调用适配器中的相关通知方法。

在您的示例中,mAdaper 作为适配器,dataModels 作为数据集。

更改说,dataModels 的索引 3。 dataModels.get(2).changeSomething();

然后您需要 tell the adapter 您更改了该索引。 mAdaper.notifyItemChanged(2).

顺便说一句,我建议您在编写代码时坚持一种代码样式标准(并进行一些拼写检查)。例如,在某些地方,您会使用 m 作为前缀,但有时您不会这样做。

【讨论】:

  • 谢谢你,但我不知道你的代码:(。你能把简单的代码发给我还是编辑我的代码然后发给我?拜托
  • 花几分钟阅读我写的内容并将其应用到您的代码中。 developer reference 这里也不错。
猜你喜欢
  • 1970-01-01
  • 2016-12-27
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
相关资源
最近更新 更多