下午好!
我有一个片段,其中包含保存有书签元素的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);
}
}
}
答案 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
}
}
希望这会有所帮助。