带有收藏夹按钮的列表视图
listview with favorite button
在我的项目中,我有一个带有星形图像的 listView。如果用户触摸一个星标项目,则将其添加到收藏夹。所有代码都是正确的,但是当列表视图滚动星形图像变为不喜欢时。这是我的代码:
private class MyAdapter extends ArrayAdapter<String> {
public MyAdapter(Context context, int resource, int textViewResourceId,
String[] strings) {
super(context, resource, textViewResourceId, strings);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.custom_list_item, parent, false);
String my_string = title[position].toString();
final TextView content_title = (TextView) row.findViewById(R.id.contentitle);
final ImageView favicon = (ImageView) row.findViewById(R.id.favicon);
content_title.setText(my_string);
content_title.setTypeface(koodakfont);
if (favicon.getTag().equals("fav")) {
favicon.setImageResource(R.drawable.favicon);
favicon.setTag("fav");
}
favicon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (favicon.getTag().equals("unfav")) {
favicon.setImageResource(R.drawable.favicon);
favicon.setTag("fav");
} else {
favicon.setImageResource(R.drawable.unfavicon);
favicon.setTag("unfav");
}
}
});
return row;
}
编辑:下面的编辑对我也不起作用。
static class ViewHolder {
ImageView favicon;
}
private class MyAdapter extends ArrayAdapter<String> {
public MyAdapter(Context context, int resource, int textViewResourceId,
String[] strings) {
super(context, resource, textViewResourceId, strings);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.custom_list_item, parent, false);
String my_string = title[position].toString();
final TextView content_title = (TextView) row.findViewById(R.id.contentitle);
final ViewHolder holder = new ViewHolder();
holder.favicon = (ImageView) row.findViewById(R.id.favicon);
content_title.setText(my_string);
content_title.setTypeface(koodakfont);
if (holder.favicon.getTag().equals("fav")) {
holder.favicon.setImageResource(R.drawable.favicon);
holder.favicon.setTag("fav");
}
holder.favicon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.favicon.getTag().equals("unfav")) {
holder.favicon.setImageResource(R.drawable.favicon);
holder.favicon.setTag("fav");
} else {
holder.favicon.setImageResource(R.drawable.unfavicon);
holder.favicon.setTag("unfav");
}
}
});
return row;
}
这里你的问题是 favicon
当你滚动 ListView
时对象被再次创建。其中 tag
未设置,因为您是以编程方式设置的。
我的建议是使用 View-Holder 模式。
首先,每次调用 getView 时,您都会膨胀一个新视图,而这些视图应该被重用。检查视图持有者模式 - Smooth Scrolling
现在关于你的问题,你要么需要一个数组来保存每个位置的收藏夹状态值(一个与标题大小相同的数组),要么将列表模式设置为 CHOICE_MODE_MULTIPLE 并更改收藏夹状态带有背景色选择器。
是View
回收的问题,基本上当你滚动的时候,View又被创建了,所以你的星标状态就丢失了。您需要实现一个逻辑来检查您需要在哪个状态下为 每个 调用 getView
设置图标。一个好的起点可能是使用项目在 ListView
中的位置来检查,当创建 View
时,您是否需要将您最喜欢的图标设置为加星标或未加星标。
我建议你阅读 this answer,它详细解释了该机制。
这是您可以执行的操作的简化示例:
private boolean[] favorites; // initialize this array on creation of your adapter with the same size as your listView
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//the rest of your code
if(favorites[position]){
holder.favicon.setImageResource(R.drawable.favicon);
else{
holder.favicon.setImageResource(R.drawable.unfavicon);
}
holder.favicon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (favorites[position]) {
holder.favicon.setImageResource(R.drawable.unfavicon);
favorites[position] = false;
} else {
holder.favicon.setImageResource(R.drawable.favicon);
favorites[position] = true;
}
}
});
出于效率原因,我还建议您开始使用 ViewHolder 模式,尽管您的问题与此无关。
在我的项目中,我有一个带有星形图像的 listView。如果用户触摸一个星标项目,则将其添加到收藏夹。所有代码都是正确的,但是当列表视图滚动星形图像变为不喜欢时。这是我的代码:
private class MyAdapter extends ArrayAdapter<String> {
public MyAdapter(Context context, int resource, int textViewResourceId,
String[] strings) {
super(context, resource, textViewResourceId, strings);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.custom_list_item, parent, false);
String my_string = title[position].toString();
final TextView content_title = (TextView) row.findViewById(R.id.contentitle);
final ImageView favicon = (ImageView) row.findViewById(R.id.favicon);
content_title.setText(my_string);
content_title.setTypeface(koodakfont);
if (favicon.getTag().equals("fav")) {
favicon.setImageResource(R.drawable.favicon);
favicon.setTag("fav");
}
favicon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (favicon.getTag().equals("unfav")) {
favicon.setImageResource(R.drawable.favicon);
favicon.setTag("fav");
} else {
favicon.setImageResource(R.drawable.unfavicon);
favicon.setTag("unfav");
}
}
});
return row;
}
编辑:下面的编辑对我也不起作用。
static class ViewHolder {
ImageView favicon;
}
private class MyAdapter extends ArrayAdapter<String> {
public MyAdapter(Context context, int resource, int textViewResourceId,
String[] strings) {
super(context, resource, textViewResourceId, strings);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.custom_list_item, parent, false);
String my_string = title[position].toString();
final TextView content_title = (TextView) row.findViewById(R.id.contentitle);
final ViewHolder holder = new ViewHolder();
holder.favicon = (ImageView) row.findViewById(R.id.favicon);
content_title.setText(my_string);
content_title.setTypeface(koodakfont);
if (holder.favicon.getTag().equals("fav")) {
holder.favicon.setImageResource(R.drawable.favicon);
holder.favicon.setTag("fav");
}
holder.favicon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.favicon.getTag().equals("unfav")) {
holder.favicon.setImageResource(R.drawable.favicon);
holder.favicon.setTag("fav");
} else {
holder.favicon.setImageResource(R.drawable.unfavicon);
holder.favicon.setTag("unfav");
}
}
});
return row;
}
这里你的问题是 favicon
当你滚动 ListView
时对象被再次创建。其中 tag
未设置,因为您是以编程方式设置的。
我的建议是使用 View-Holder 模式。
首先,每次调用 getView 时,您都会膨胀一个新视图,而这些视图应该被重用。检查视图持有者模式 - Smooth Scrolling
现在关于你的问题,你要么需要一个数组来保存每个位置的收藏夹状态值(一个与标题大小相同的数组),要么将列表模式设置为 CHOICE_MODE_MULTIPLE 并更改收藏夹状态带有背景色选择器。
是View
回收的问题,基本上当你滚动的时候,View又被创建了,所以你的星标状态就丢失了。您需要实现一个逻辑来检查您需要在哪个状态下为 每个 调用 getView
设置图标。一个好的起点可能是使用项目在 ListView
中的位置来检查,当创建 View
时,您是否需要将您最喜欢的图标设置为加星标或未加星标。
我建议你阅读 this answer,它详细解释了该机制。
这是您可以执行的操作的简化示例:
private boolean[] favorites; // initialize this array on creation of your adapter with the same size as your listView
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//the rest of your code
if(favorites[position]){
holder.favicon.setImageResource(R.drawable.favicon);
else{
holder.favicon.setImageResource(R.drawable.unfavicon);
}
holder.favicon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (favorites[position]) {
holder.favicon.setImageResource(R.drawable.unfavicon);
favorites[position] = false;
} else {
holder.favicon.setImageResource(R.drawable.favicon);
favorites[position] = true;
}
}
});
出于效率原因,我还建议您开始使用 ViewHolder 模式,尽管您的问题与此无关。