RecyclerView图像背景随机变化

时间:2015-08-16 17:57:00

标签: android android-recyclerview imageview android-cardview

我已使用RecyclerView实施了CardView。每个CardView都有ImageView,我想根据查询结果更改其背景颜色(空结果集 - >格雷/非空结果集 - >红色),这是实现的在onBindViewHolder的{​​{1}}上。

以下是适配器代码(为清晰起见,我删除了大部分代码):

RecyclerView Adapter

适配器收到public class FavDirsAdapter extends RecyclerView.Adapter<FavDirsAdapter.FavDirsViewHolder> { private LayoutInflater mInflater; private Cursor mCursor; private Context mContext; private int range; private FragmentManager mFragmentManager; public FavDirsAdapter(Context context, Cursor cursor, FragmentManager fm) { mInflater = LayoutInflater.from(context); mCursor = cursor; mContext = context; range = cursor.getCount(); mFragmentManager = fm; } @Override public FavDirsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final View view = mInflater.inflate(R.layout.item_fav_dirs_list, parent, false); return new FavDirsViewHolder(view); } @Override public void onBindViewHolder(final FavDirsViewHolder viewHolder, final int position) { if (mCursor.moveToFirst()) { mCursor.moveToPosition(position); viewHolder.favDirsItemTextView.setText(mCursor.getString(mCursor.getColumnIndex( (FilmoContract.FavDirEntry.COLUMN_DIR)))); getDirImage(viewHolder); setScheduledFilmsColor(viewHolder); } } @Override public int getItemCount() { if (mCursor.moveToFirst()) { return range; } return 0; } class FavDirsViewHolder extends RecyclerView.ViewHolder{ TextView favDirsItemTextView; ImageView favDirsItemImageView; ImageView favDirsItemScheduledFilmsImage; public FavDirsViewHolder(View itemView) { super(itemView); favDirsItemTextView = (TextView) itemView.findViewById(R.id.fav_dirs_item_text_view); favDirsItemImageView = (ImageView) itemView.findViewById(R.id.fav_dirs_item_image_view); favDirsItemScheduledFilmsImage = (ImageView) itemView.findViewById(R.id.fav_dirs_item_scheduled_films_image_button); } } private void setScheduledFilmsColor(FavDirsViewHolder viewHolder) { new SetScheduledFilmsColor(viewHolder, mContext).execute(); } private void getDirImage (FavDirsViewHolder viewHolder) { new FetchFavDirsImage(viewHolder, mContext).execute(); } } ,其中包含存储在Cursor上的Films Director数据列表。然后将每个行数据分配给DB文件。

然后我做了一个额外的查询,以确定每个导演很快就安排了电影,并根据查询结果,为ViewHolder(favDirsItemScheduledFilmsImage)背景上色。

我首先尝试在ImageView适配器的方法上进行查询,但我发现所有onBindViewHolder都以相同颜色(灰色)着色。因此,由于涉及ImageViews,我试图创建一个DB Query(SetScheduledFilmsColor)来完成所有这些工作。这是代码:

AsyncTask

我正在更改public class SetScheduledFilmsColor extends AsyncTask<Void, Void, Boolean> { private ImageView mImageButton; private String mDirName; private Context mContext; boolean scheduledFilms; static final String[] PROGRAM_COLUMNS = { FilmoContract.FilmEntry._ID, FilmoContract.FilmEntry.COLUMN_DATE, FilmoContract.FilmEntry.COLUMN_TIME, FilmoContract.FilmEntry.COLUMN_CYCLE, FilmoContract.FilmEntry.COLUMN_TITLE, }; public SetScheduledFilmsColor(FavDirsAdapter.FavDirsViewHolder viewHolder, Context context) { mImageButton = viewHolder.favDirsItemScheduledFilmsImage; //mImageButton = new ImageButton(mContext); mDirName = viewHolder.favDirsItemTextView.getText().toString(); mContext = context; } @Override protected Boolean doInBackground(Void... params) { Uri filmoDirector = FilmoContract.FilmEntry.buildProgramUriWithDirector(); Cursor tempCursor = mContext.getContentResolver().query( filmoDirector, PROGRAM_COLUMNS, mDirName, null, null ); scheduledFilms = tempCursor.moveToFirst(); tempCursor.close(); return scheduledFilms; } @Override protected void onPostExecute(Boolean scheduledFilms) { super.onPostExecute(scheduledFilms); mImageButton.setImageResource(R.drawable.ic_new_releases_white_24dp); if (scheduledFilms) { //mImageButton.getBackground().clearColorFilter(); mImageButton.getBackground().setColorFilter( mContext.getResources().getColor(R.color.lafilmo_color), PorterDuff.Mode.MULTIPLY ); } else { //mImageButton.getBackground().clearColorFilter(); mImageButton.getBackground().setColorFilter( mContext.getResources().getColor(R.color.dividers), PorterDuff.Mode.MULTIPLY ); } } } 方法中的颜色。但是,即使执行此onPostExecute,查询结果也无关紧要(我确定查询和asynchronously条件都没问题,我已经调试了)。更重要的是,每次我在浏览应用时重新加载onPostExecute RecyclerView时,彩色Fragment每次都会有所不同。

我不明白,ImageViews如何将引用正确地保存到其他RecyclerView字段(CardView上的文件,如favDirsItemTextView或favDirsItemImageView),这些字段在viewHolder,并且不保留对彩色onBindViewHolder(favDirsItemScheduledFilmsImage)的引用。

有人可以对此有所了解吗?有更好的方法吗?

谢谢!

0 个答案:

没有答案