RecyclerView 即使在滚动后仍保留元素和视图
RecyclerView keeping elements and views even after scroll
我正在尝试创建一个安装有 RecyclerView 的应用列表。但不是设备中的所有应用程序,而是一些应用程序。
我已经将这些应用程序的包设置在一个字符串数组中,代码会检查用户是否安装了该应用程序。每个应用程序都有一个彩色的 drawable/icon 来识别它,如果用户没有安装该应用程序,drawable/icon 会变成黑色和白色。
它有效,但是在向下滚动然后再次向上滚动后,原本应该安装的彩色项目变成了黑色和白色,甚至在滚动了一些之后它也没有再次获得原来的颜色。
有人可以告诉我如何预防或解决这个问题吗?提前致谢。
这是我的适配器代码:
package jahirfiquitiva.project.adapters;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ColorFilter;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.drawable.Drawable;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import jahirfiquitiva.project.activities.AppsListActivity;
import java.util.List;
import jahirfiquitiva.project.R;
import jahirfiquitiva.project.views.SquareImageView;
public class AppsAdapter extends RecyclerView.Adapter<AppsAdapter.AppHolder> implements View.OnClickListener {
public interface ClickListener {
void onClick(int index);
}
private final Context mContext;
private final List<AppsListActivity.App> apps;
private final ClickListener mCallback;
public AppsAdapter(Context context, List<AppsListActivity.App> apps, ClickListener callback) {
this.mContext = context;
this.apps = apps;
this.mCallback = callback;
}
@Override
public AppHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
return new AppHolder(inflater.inflate(R.layout.app_item, parent, false));
}
@Override
public void onBindViewHolder(AppHolder holder, int position) {
// Turns App name "Something Pro" to "l_something_pro"
int iconResource = mContext.getResources().getIdentifier(
"ic_" + apps.get(position).name.toLowerCase().replace(" ", "_"),
"drawable",
mContext.getPackageName()
);
holder.icon.setImageResource(R.drawable.placeholder);
if (apps.get(position).isInstalled(mContext)) {
holder.icon.setImageResource(iconResource);
} else {
holder.icon.setImageResource(iconResource);
makeBlackAndWhite(holder.icon);
}
holder.appname.setText(apps.get(position).name);
holder.view.setTag(position);
holder.view.setOnClickListener(this);
}
@Override
public int getItemCount() {
return apps.size();
}
@Override
public void onClick(View v) {
if (v.getTag() != null) {
int index = (Integer) v.getTag();
if (mCallback != null)
mCallback.onClick(index);
}
}
class AppHolder extends RecyclerView.ViewHolder {
final View view;
ImageView icon;
final TextView appname;
final CardView contentBg;
LinearLayout textsBg;
AppHolder(View v) {
super(v);
view = v;
icon = (ImageView) v.findViewById(R.id.appicon);
contentBg = (CardView) v.findViewById(R.id.app_item_card);
appname = (TextView) v.findViewById(R.id.appname);
textsBg = (LinearLayout) v.findViewById(R.id.texts_bg);
}
}
private void makeBlackAndWhite(ImageView iv) {
float[] colorMatrix = {
0.33f, 0.33f, 0.33f, 0, 30, //red
0.33f, 0.33f, 0.33f, 0, 30, //green
0.33f, 0.33f, 0.33f, 0, 30, //blue
0, 0, 0, 1, 0 //alpha
};
ColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
iv.setColorFilter(colorFilter);
}
}
您在未安装时将图标设为黑色和白色,但视图已被回收,因此您需要再次使它们着色,如果已安装则删除 colorFilter(在 isInstalled
有条件的)。
我正在尝试创建一个安装有 RecyclerView 的应用列表。但不是设备中的所有应用程序,而是一些应用程序。
我已经将这些应用程序的包设置在一个字符串数组中,代码会检查用户是否安装了该应用程序。每个应用程序都有一个彩色的 drawable/icon 来识别它,如果用户没有安装该应用程序,drawable/icon 会变成黑色和白色。
它有效,但是在向下滚动然后再次向上滚动后,原本应该安装的彩色项目变成了黑色和白色,甚至在滚动了一些之后它也没有再次获得原来的颜色。
有人可以告诉我如何预防或解决这个问题吗?提前致谢。
这是我的适配器代码:
package jahirfiquitiva.project.adapters;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ColorFilter;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.drawable.Drawable;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import jahirfiquitiva.project.activities.AppsListActivity;
import java.util.List;
import jahirfiquitiva.project.R;
import jahirfiquitiva.project.views.SquareImageView;
public class AppsAdapter extends RecyclerView.Adapter<AppsAdapter.AppHolder> implements View.OnClickListener {
public interface ClickListener {
void onClick(int index);
}
private final Context mContext;
private final List<AppsListActivity.App> apps;
private final ClickListener mCallback;
public AppsAdapter(Context context, List<AppsListActivity.App> apps, ClickListener callback) {
this.mContext = context;
this.apps = apps;
this.mCallback = callback;
}
@Override
public AppHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
return new AppHolder(inflater.inflate(R.layout.app_item, parent, false));
}
@Override
public void onBindViewHolder(AppHolder holder, int position) {
// Turns App name "Something Pro" to "l_something_pro"
int iconResource = mContext.getResources().getIdentifier(
"ic_" + apps.get(position).name.toLowerCase().replace(" ", "_"),
"drawable",
mContext.getPackageName()
);
holder.icon.setImageResource(R.drawable.placeholder);
if (apps.get(position).isInstalled(mContext)) {
holder.icon.setImageResource(iconResource);
} else {
holder.icon.setImageResource(iconResource);
makeBlackAndWhite(holder.icon);
}
holder.appname.setText(apps.get(position).name);
holder.view.setTag(position);
holder.view.setOnClickListener(this);
}
@Override
public int getItemCount() {
return apps.size();
}
@Override
public void onClick(View v) {
if (v.getTag() != null) {
int index = (Integer) v.getTag();
if (mCallback != null)
mCallback.onClick(index);
}
}
class AppHolder extends RecyclerView.ViewHolder {
final View view;
ImageView icon;
final TextView appname;
final CardView contentBg;
LinearLayout textsBg;
AppHolder(View v) {
super(v);
view = v;
icon = (ImageView) v.findViewById(R.id.appicon);
contentBg = (CardView) v.findViewById(R.id.app_item_card);
appname = (TextView) v.findViewById(R.id.appname);
textsBg = (LinearLayout) v.findViewById(R.id.texts_bg);
}
}
private void makeBlackAndWhite(ImageView iv) {
float[] colorMatrix = {
0.33f, 0.33f, 0.33f, 0, 30, //red
0.33f, 0.33f, 0.33f, 0, 30, //green
0.33f, 0.33f, 0.33f, 0, 30, //blue
0, 0, 0, 1, 0 //alpha
};
ColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
iv.setColorFilter(colorFilter);
}
}
您在未安装时将图标设为黑色和白色,但视图已被回收,因此您需要再次使它们着色,如果已安装则删除 colorFilter(在 isInstalled
有条件的)。