Android 带有收藏夹按钮的listview
在我的项目中,我有一个带有星图的列表视图。如果用户触摸星号项目,则添加到收藏夹。所有代码都是正确的,但当listview滚动星图时,星图将更改为“不利”。这是我的代码:Android 带有收藏夹按钮的listview,android,android-listview,Android,Android Listview,在我的项目中,我有一个带有星图的列表视图。如果用户触摸星号项目,则添加到收藏夹。所有代码都是正确的,但当listview滚动星图时,星图将更改为“不利”。这是我的代码: private class MyAdapter extends ArrayAdapter<String> { public MyAdapter(Context context, int resource, int textViewResourceId, Strin
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;
}
私有类MyAdapter扩展了ArrayAdapter{
公共MyAdapter(上下文上下文、int资源、int textViewResourceId、,
字符串[]字符串){
super(上下文、资源、textViewResourceId、字符串);
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)getSystemService(Context.LAYOUT\u充气器\u服务);
视图行=充气机。充气(R.layout.custom\u list\u项,父项,false);
String my_String=title[position].toString();
final TextView content_title=(TextView)row.findViewById(R.id.contentTitle);
最终ImageView favicon=(ImageView)row.findViewById(R.id.favicon);
content\u title.setText(我的字符串);
content_title.setTypeface(koodakfont);
if(favicon.getTag().equals(“fav”)){
setImageResource(R.drawable.favicon);
favicon.setTag(“fav”);
}
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(favicon.getTag().equals(“unfav”)){
setImageResource(R.drawable.favicon);
favicon.setTag(“fav”);
}否则{
favicon.setImageResource(R.drawable.unfavicon);
favicon.setTag(“unfav”);
}
}
});
返回行;
}
编辑:下面的编辑也不适合我
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;
}
静态类视图保持器{
ImageView favicon;
}
私有类MyAdapter扩展了ArrayAdapter{
公共MyAdapter(上下文上下文、int资源、int textViewResourceId、,
字符串[]字符串){
super(上下文、资源、textViewResourceId、字符串);
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)getSystemService(Context.LAYOUT\u充气器\u服务);
视图行=充气机。充气(R.layout.custom\u list\u项,父项,false);
String my_String=title[position].toString();
final TextView content_title=(TextView)row.findViewById(R.id.contentTitle);
最终视图持有者=新的视图持有者();
holder.favicon=(ImageView)row.findViewById(R.id.favicon);
content\u title.setText(我的字符串);
content_title.setTypeface(koodakfont);
if(holder.favicon.getTag()等于(“fav”)){
holder.favicon.setImageResource(R.drawable.favicon);
固定标签持有人(简称“固定标签”);
}
holder.favicon.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(holder.favicon.getTag()等于(“unfav”)){
holder.favicon.setImageResource(R.drawable.favicon);
固定标签持有人(简称“固定标签”);
}否则{
持有者.favicon.setImageResource(R.可绘制.未绘制);
持有人favicon.setTag(“unfav”);
}
}
});
返回行;
}
这里的问题是,当您滚动ListView
时,会再次创建favicon
对象。在该对象中,标记
未设置,因为您是通过编程方式设置的
我的建议是使用模式。这里的问题是,当您滚动
ListView
时,会再次创建favicon
对象。在该对象中,tag
未设置,因为您是通过编程方式设置的
我的建议是使用模式。首先,每次调用getView时,当它们应该被重用时,您都会膨胀一个新视图。请检查视图保持器模式-
关于您的问题,您需要一个数组来保存每个位置的favs状态值(一个与标题大小相同的数组)或者将列表模式设置为CHOICE_mode_MULTIPLE,并使用backgoung选择器更改favion状态。首先,每次调用getView时,您都会在重新使用它们时膨胀新视图。请检查视图保持器模式-
关于您的问题,您需要一个数组来保存每个位置的favs状态值(一个与标题大小相同的数组)或者将列表模式设置为CHOICE\u mode\u MULTIPLE,并使用backgoung选择器更改favion状态。这是一个
视图回收的问题,基本上当您滚动时,视图会再次创建,因此星形图标的状态会丢失。您需要实现一个逻辑来检查您需要将图标设置为的哪个状态y调用getView
。一个好的起点可以是在创建视图时,使用项目在列表视图中的位置来检查是否需要将收藏夹图标设置为星号或非星号。
我建议你读一读,它详细地解释了这个机制。
下面是一个简单的示例,说明您可以做什么:
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;
}
}
});
出于效率考虑,我还建议您开始使用该模式,尽管您的问题与此无关。这是一个视图
回收的问题,基本上当您滚动时,视图会再次创建,因此星形图标的状态会丢失。您需要实现一个逻辑来检查需要设置图标的状态对于每次调用getView
,一个好的起点可能是在创建视图时,使用项目在列表视图中的位置来检查是否需要将收藏夹图标设置为星号或非星号。
我建议你读一读,它详细地解释了这个机制。
下面是一个简单的示例,说明您可以做什么:
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;
}
}
});
艾尔