引用片段中的recyclerView元素

时间:2018-07-17 10:48:55

标签: android android-fragments android-recyclerview

下午好!

我有一个片段,其中包含保存有书签元素的recyclerView。元素布局上有一个星形图标,用于从SQLite数据库中删除所选项目。单击图标时,我需要将其色调设置为白色,然后将该项目的位置保存在我的片段中声明的列表中。我想知道如何做到这一点。 由于我们使用适配器绑定元素,因此无法引用片段中的图标来更改颜色。注意,它不应该刷新页面。用户按下后,它将更改保存在数据库中  

片段

public class BookMarksFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener, View.OnClickListener {
private BookMarksAdapter listAdapter;
private List<BookmarksModel> bookmarks = new ArrayList<>();
private FragmentBookmarksBinding binding;
private DBHelper dbHelper;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Functions.setLanguages(App.getCurrentActivity());
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_bookmarks, container, false);

    binding.refresher.setColorSchemeResources(R.color.drawer_background);
    binding.refresher.setOnRefreshListener(this);
    binding.refresher
            .post(new Runnable() {
                      @Override
                      public void run() {
                          binding.refresher.setRefreshing(true);
                          setRefreshingState(true);
                      }
                  }
            );
    listAdapter = new BookMarksAdapter(getActivity(), bookmarks, this);
    binding.bookmarkList.setLayoutManager(new LinearLayoutManager(getActivity()));
    binding.bookmarkList.setAdapter(listAdapter);
    listAdapter.notifyDataSetChanged();

    return binding.getRoot();
}

private void setRefreshingState(final boolean b) {
    binding.refresher.post(new Runnable() {
        @Override
        public void run() {
            binding.refresher.setRefreshing(b);

            getNews();
        }
    });
}

private void getNews() {
    dbHelper = new DBHelper(getActivity(), "kunuz", null, 1);
    bookmarks.clear();
    bookmarks.addAll(dbHelper.getBookmarks());
    if(bookmarks.size()==0){
        binding.bookmarkList.setVisibility(View.GONE);
        binding.emptyView.setVisibility(View.VISIBLE);
    }else{
        binding.emptyView.setVisibility(View.GONE);
        binding.bookmarkList.setVisibility(View.VISIBLE);
    }
    binding.refresher.setRefreshing(false);
    listAdapter.notifyDataSetChanged();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case Constants.BOOKMARK_REQUEST_CODE:
            if (resultCode == Constants.BOOKMARK_RESULT_CODE) {
                binding.refresher
                        .post(new Runnable() {
                                  @Override
                                  public void run() {
                                      binding.refresher.setRefreshing(true);
                                      setRefreshingState(true);
                                  }
                              }
                        );
            }
            break;
    }
}

@Override
public void onRefresh() {
    getNews();
}

@Override
public void onClick(View v) {
    if (v.getId()==R.id.star){
        dbHelper.deleteFavorites(v.getTag().toString());
        onRefresh();
    }else if(v.getId()==R.id.bookmark_card_view){
        Intent intent = new Intent(App.getInstance(), NewsViewActivity.class);
        intent.putExtra(Constants.NEWS_CODE, v.getTag().toString());
        getActivity().startActivity(intent);
    }
}

}



适配器

public class BookMarksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<BookmarksModel> data;
private LayoutInflater inflater;
private View.OnClickListener listener;

public BookMarksAdapter(Context context, List<BookmarksModel> data, View.OnClickListener listener) {
    this.context = context;
    this.data = data;
    this.listener = listener;
    this.inflater = LayoutInflater.from(context);
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    BookmarksItemBinding binding
            = DataBindingUtil.inflate(inflater, R.layout.bookmarks_item, parent, false);
    return new BookmarksHolder(binding.getRoot());
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    final BookmarksModel item = data.get(position);
    ((BookmarksHolder)holder).binding.setNewsItem(item);
    ((BookmarksHolder)holder).binding.categoryIcon.setImageResource(Utils.getCategoryColorByName(item.getCategory()));
    if (item.getImage_url() != null && !item.getImage_url().isEmpty()) { // TODO get image from cache
        ImageLoader.getInstance()
                .displayImage(item.getImage_url(), ((BookmarksHolder)holder).binding.newsImageView);
    } else {
        ((BookmarksHolder)holder).binding.
                newsImageView.setImageResource(R.drawable.kun_uz_logo_no_image);
    }

    ((BookmarksHolder)holder).binding.star.setTag(item.getCode());
    ((BookmarksHolder)holder).binding.star.setOnClickListener(listener);

    ((BookmarksHolder)holder).binding.bookmarkCardView.setTag(item.getCode());
    ((BookmarksHolder)holder).binding.bookmarkCardView.setOnClickListener(listener);






}


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

public class BookmarksHolder extends RecyclerView.ViewHolder {
    BookmarksItemBinding binding;

    BookmarksHolder(View root) {
        super(root);
        binding = DataBindingUtil.bind(root);
    }
}

}

2 个答案:

答案 0 :(得分:0)

OnClick星形图标上的侦听器将单击的adapterPosition发送回Fragment。

Fragment将更改存储在数据库中,并将更新列表存储在适配器中。

片段调用适配器notifyItemChanged(position)

适配器onBindViewHolder在此位置重新读取项目并适当设置星形。

答案 1 :(得分:0)

您需要在 BookmarksModel 类中添加一些标志,以了解您的书签是处于活动状态(在db中)还是处于非活动状态(不在db中)。

public BookmarksModel{
   ....
   ....
   public isSaved;
}

现在在您的onBindViewHolder方法中。

final BookmarksModel item = data.get(position);
((BookmarksHolder)holder).binding.setNewsItem(item);
.....
.....
if(item.isSaved){
   ((BookmarksHolder)holder).star.setAlpha(1f);  //set your tint value
}else{
   ((BookmarksHolder)holder).star.setAlpha(0.5ff);  //set your tint value
}
((BookmarksHolder)holder).binding.star.setTag(position);   // just set the position
((BookmarksHolder)holder).binding.star.setOnClickListener(listener);

((BookmarksHolder)holder).binding.bookmarkCardView.setTag(position);
((BookmarksHolder)holder).binding.bookmarkCardView.setOnClickListener(listener);

在您的片段onClick()

public void onClick(View v) {
   if (v.getId()==R.id.star){
     int pos = (Integer)v.getTag();
     BookmarksModel model = listAdapter.getList(pos); //create a getter in your 
     if(!model.isSaved) //toggled to saved bookmark
        ///////////////// your code to save bookmark
     else
        dbHelper.deleteFavorites(v.getTag().toString()); ///// your code for deleting bookmark
    model.isSaved = !model.isSaved;
    listAdapter.notifyItemChanged(pos);  // refreshes your recyclerView item
   }
}

希望这会有所帮助。