2013-11-01 53 views
0

我有自定义适配器的列表视图。自定义的adater只是TextView和2个ImageButton。 当单击ImageButton时,我希望它的图像切换。然而,这工作,当我向下滚动一些随机项目也切换。带有自定义适配器状态持久性的ListView

所以我认为这与屏幕上物品位置的相对性有关。所以我给每个ImageButton分配一个标签,这个标签对应于它在列表视图中的位置。然后,我使用下面的代码来正确选择必要的项目:

int firstVisiblePos = listView.getFirstVisiblePosition(); 
    int viewPos = 0; 
    int position = Integer.parseInt(v.getTag().toString()); 
    Toast.makeText(this, v.getTag().toString(), Toast.LENGTH_SHORT).show(); 
    for (int i = 0; i < listView.getChildCount(); i++) { 
     viewPos = firstVisiblePos + i; 
     if (viewPos == position) {    
      relativeLayout = (RelativeLayout) listView.getChildAt(position); 
      break; 
     } 
    } 

但我仍然经历同样的行为。 任何帮助表示赞赏。

UPD:

public class CustomAdapter extends BaseAdapter { 
private ArrayList<String> data; 
private Activity myActivity; 
private LayoutInflater inflater; 

public CustomAdapter(Activity activity, ArrayList<String> data) { 
    this.myActivity = activity; 
    this.data = data; 
    this.inflater = (LayoutInflater) myActivity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    return data.size(); 
} 

@Override 
public Object getItem(int position) { 
    return data.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.list_row, null); 
    } 

    TextView proverb = (TextView) convertView.findViewById(R.id.title); 
    proverb.setText(data.get(position)); 
    proverb.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 14); 
    proverb.setTypeface(MainActivity.tf, 1); 
    ImageButton favBtn = (ImageButton) convertView.findViewById(R.id.btn_favorite); 
    if(MainActivity.favorites.contains(data.get(position))){ 
     // favorite, set fav icon 
     favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.fav));   
    }  
    favBtn.setTag(position); 
    return convertView; 
} 

}

+0

发表您的自定义适配器的您getView()方法。 –

+0

从getView()其不清楚,所以发布你的完整Adapter类。 –

回答

1

尝试这样

首先创建一个模型来存储的价值和检查Favurite

public class Data { 

private String value; 
private boolean favurite; 

public Data(String value,boolean favurite){ 
    this.value=value; 
    this.favurite=favurite; 
} 
public String getValue() { 
    return value; 
} 
public void setValue(String value) { 
    this.value = value; 
} 
public boolean isFavurite() { 
    return favurite; 
} 
public void setFavurite(boolean favurite) { 
    this.favurite = favurite; 
} 

}

然后研究所在你的Activity

ArrayList<Data> list=new ArrayList<Data>(); 
     list.add(new Data("value1", false)); 
     list.add(new Data("value2", false)); 

创建ArrayList<String>将其更改为ArrayList<Data>并将它传递给CustomAdapter类的EAD

我改变了你的适配器类,使工作

public class CustomAdapter extends BaseAdapter { 
    private ArrayList<Data> data; 
    private Activity myActivity; 
    private LayoutInflater inflater; 

    public CustomAdapter(Activity activity, ArrayList<Data> data) { 
     this.myActivity = activity; 
     this.data = data; 
     this.inflater = (LayoutInflater) myActivity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 

    @Override 
    public int getCount() { 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return data.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.list_row, null); 
    } 
    final Data d=data.get(position); 
    TextView proverb = (TextView) convertView.findViewById(R.id.title); 
    proverb.setText(d.getValue()); 
    proverb.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 14); 
    proverb.setTypeface(MainActivity.tf, 1); 
    final ImageButton favBtn = (ImageButton) convertView.findViewById(R.id.btn_favorite); 

    if(d.isFavurite()) 
     favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.fav));  
    else 
     favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.Non_fav)); 

    favBtn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      d.setFavurite(true); 
      favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.fav));  
      notifyDataSetChanged(); 
     } 
    }); 
    return convertView; 
} 

}

希望这能解决你的问题。

+0

我介绍了您提出的更改。但是,我没有创建一个新的Data类。有用。非常感谢。 – Asterisk

+0

@星号很高兴为您效劳。随时欢迎。 –

1

问题是,当用户滚动浏览列表视图时,您的列表项将被重用。因此,您必须每次都基于数据重建列表项。看起来你正在改变图像,如果该项目是最喜欢的,但如果它不是最喜欢的,你不会改变它。

尝试改变

if(MainActivity.favorites.contains(data.get(position))){ 
    // favorite, set fav icon 
    favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.fav));   
} 

if(MainActivity.favorites.contains(data.get(position))){ 
    // favorite, set fav icon 
    favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.fav));   
} else { 
    // not favorite, set default icon 
    favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.notfav)); 
} 

我假设当你点击图像按钮将其添加到data.get(position)MainActivity.favorites当你再次点击删除。

+0

你的假设是正确的。 – Asterisk

+0

更改工作是如何进行的? –

+0

它解决了原来的问题,但现在我得到空指针异常。我将你的答案和Amit Gupta的答案结合起来,得到了充分的工作解决方案。谢谢。 – Asterisk

0

做一件事,,,不检查convertView的无效,并直接一个代码由一个,,,这样

 @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     convertView = inflater.inflate(R.layout.list_row, null); 


    TextView proverb = (TextView) convertView.findViewById(R.id.title); 
    proverb.setText(data.get(position)); 
    proverb.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 14); 
    proverb.setTypeface(MainActivity.tf, 1); 
    ImageButton favBtn = (ImageButton) convertView.findViewById(R.id.btn_favorite); 
    if(MainActivity.favorites.contains(data.get(position))){ 
     // favorite, set fav icon 
     favBtn.setImageDrawable(myActivity.getResources().getDrawable(R.drawable.fav));   
    }  
    favBtn.setTag(position); 
    return convertView; 
} 
+0

为什么要重新查看视图而不是仅仅编辑它? –

+0

其实它是从我身边发现,,,,当我们每次在listview中滚动切换问题都会被解决时充气视图 –

相关问题