Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在自定义ListView中更新ImageView的图像_Android_Listview_Imageview - Fatal编程技术网

Android 如何在自定义ListView中更新ImageView的图像

Android 如何在自定义ListView中更新ImageView的图像,android,listview,imageview,Android,Listview,Imageview,我试图单击自定义listview的imageview,并希望在onClick事件中更改它们的图像。我可以单击“成功”按钮执行其他操作,但图像未反映在imageview中 下面是代码供参考 public class ReminderAdapter extends BaseAdapter { private Activity activity; private static LayoutInflater inflater=null; ImageView firstStar,secondSta

我试图单击自定义listview的imageview,并希望在onClick事件中更改它们的图像。我可以单击“成功”按钮执行其他操作,但图像未反映在imageview中

下面是代码供参考

public class ReminderAdapter extends BaseAdapter {

private Activity activity;   
private static LayoutInflater inflater=null;
ImageView firstStar,secondStar,thirdStar,fourthStar,fifthStar;   

public ReminderAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    faceBold = Typeface.createFromAsset(activity.getAssets(),
            "fonts/eau_sans_bold.otf");
    faceNormal = Typeface.createFromAsset(activity.getAssets(),
            "fonts/eau_sans_book.otf");         

}

public int getCount() {
    return data.size();
}
public Object getItem(int position) {
    return position;
}
public long getItemId(int position) {
    return position;
}    
public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;        


   if(activity instanceof SearchDishoom)
   {
       if(convertView==null)
           vi = inflater.inflate(R.layout.remind_dish_list_row, null);        

       firstStar = (ImageView)vi.findViewById(R.id.hotelListFirstStar);
       secondStar = (ImageView)vi.findViewById(R.id.hotelListSecondStar);
       thirdStar = (ImageView)vi.findViewById(R.id.hotelListThirdStar);
       fourthStar = (ImageView)vi.findViewById(R.id.hotelListFourthStar);
       fifthStar = (ImageView)vi.findViewById(R.id.hotelListFifthStar);
       firstStar.setFocusable(false);
       secondStar.setFocusable(false);
       thirdStar.setFocusable(false);
       fourthStar.setFocusable(false);
       fifthStar.setFocusable(false);           

       firstStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(1);

        }
    });
       secondStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            //ReminderList.clear();
            setStar(2);                 
        }
    });
       thirdStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(3);                 
        }
    });
       fourthStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(4);                 
        }
    });
       fifthStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {                
            setStar(5);                 
        }
    });           
   }       
    return vi;
}


  public void setStar(int btnNumber) {
    if (btnNumber == 1) {       

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.unrated);
        thirdStar.setImageResource(R.drawable.unrated);
        fourthStar.setImageResource(R.drawable.unrated);
        fifthStar.setImageResource(R.drawable.unrated);
        //postRating(1);
    }
    if (btnNumber == 2) {           

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.rated);
        thirdStar.setImageResource(R.drawable.unrated);
        fourthStar.setImageResource(R.drawable.unrated);
        fifthStar.setImageResource(R.drawable.unrated);
        //postRating(2);
    }
    if (btnNumber == 3) {           

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.rated);
        thirdStar.setImageResource(R.drawable.rated);
        fourthStar.setImageResource(R.drawable.unrated);
        fifthStar.setImageResource(R.drawable.unrated);
        //postRating(3);
    }
    if (btnNumber == 4) {

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.rated);
        thirdStar.setImageResource(R.drawable.rated);
        fourthStar.setImageResource(R.drawable.rated);
        fifthStar.setImageResource(R.drawable.unrated);
        //postRating(4);
    }
    if (btnNumber == 5) {

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.rated);
        thirdStar.setImageResource(R.drawable.rated);
        fourthStar.setImageResource(R.drawable.rated);
        fifthStar.setImageResource(R.drawable.rated);
        //postRating(5);
    }
}   
公共类提醒适配器扩展BaseAdapter{
私人活动;
专用静态充气机=空;
ImageView第一颗星、第二颗星、第三颗星、第四颗星、第五颗星;
公共提醒适配器(活动a,阵列列表d){
活动=a;
数据=d;
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
faceBold=Typeface.createFromAsset(activity.getAssets(),
“字体/eau_sans_bold.otf”);
faceNormal=Typeface.createFromAsset(activity.getAssets(),
“字体/eau_sans_book.otf”);
}
public int getCount(){
返回data.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}    
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
if(SearchDishoom的活动实例)
{
if(convertView==null)
vi=充气机。充气(R.layout.remind\u dish\u list\u row,空);
firstStar=(ImageView)vi.findViewById(R.id.hotelListFirstStar);
secondStar=(ImageView)vi.findViewById(R.id.hotelListSecondStar);
thirdStar=(ImageView)vi.findViewById(R.id.hotelListThirdStar);
fourthStar=(ImageView)vi.findViewById(R.id.hotelListFourthStar);
fifthStar=(ImageView)vi.findViewById(R.id.hotelListFifthStar);
firstStar.setFocusable(假);
secondStar.setFocusable(假);
第三个星设置聚焦(假);
第四颗星。设置聚焦(假);
第五颗星。设置聚焦(假);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
固定星(1);
}
});
secondStar.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
//提醒列表。清除();
setStar(2);
}
});
thirdStar.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
setStar(3);
}
});
fourthStar.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
setStar(4);
}
});
fifthStar.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图arg0){
固定星(5);
}
});           
}       
返回vi;
}
公共无效设置星(int BTN编号){
如果(btnNumber==1){
firstStar.setImageResource(R.drawable.rated);
secondStar.setImageResource(R.drawable.unrated);
第三星setImageResource(R.drawable.unrated);
第四星。setImageResource(R.可绘制。未分级);
第五颗星。setImageResource(R.可绘制。未分级);
//后评价(1);
}
如果(btnNumber==2){
firstStar.setImageResource(R.drawable.rated);
secondStar.setImageResource(R.drawable.rated);
第三星setImageResource(R.drawable.unrated);
第四星。setImageResource(R.可绘制。未分级);
第五颗星。setImageResource(R.可绘制。未分级);
//后评价(2);
}
如果(btnNumber==3){
firstStar.setImageResource(R.drawable.rated);
secondStar.setImageResource(R.drawable.rated);
第三星setImageResource(R.可提取额定值);
第四星。setImageResource(R.可绘制。未分级);
第五颗星。setImageResource(R.可绘制。未分级);
//后评价(3);
}
如果(btnNumber==4){
firstStar.setImageResource(R.drawable.rated);
secondStar.setImageResource(R.drawable.rated);
第三星setImageResource(R.可提取额定值);
第四星。setImageResource(R.可绘制。额定值);
第五颗星。setImageResource(R.可绘制。未分级);
//后评价(4);
}
如果(btnNumber==5){
firstStar.setImageResource(R.drawable.rated);
secondStar.setImageResource(R.drawable.rated);
第三星setImageResource(R.可提取额定值);
第四星。setImageResource(R.可绘制。额定值);
第五颗星。设置图像资源(R.可绘制。额定值);
//后评价(5);
}
}   
我不明白发生了什么。请给我任何参考或提示。

提前谢谢。

试试这个

 firstStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(1);
            listAdapter.notifyDataSetChanged();
        }
    });

你的代码看起来有点问题

默认情况下,适配器重用其子视图,所以处理适配器的一个重要方面是更新正确目标的值

在代码中,当用户单击
firstStart
时,将调用
setStar
方法

firstStar.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {
        setStar(1);

    }
}
setStar
中,您引用了
fireStart
实例,但不能保证
fireStar
实例已连接到预期实例。例如,如果ListView中有多个项,则调用
getView
方法时,
fireStart
实例将被覆盖

public void setStar(int btnNumber) {
    if (btnNumber == 1) {

        firstStar.setImageResource(R.drawable.rated);
        ...
        //postRating(1);
    }
    ...
}
所以,您需要的是维护对正确目标的引用。一种简单的归档方法是在适配器中使用ViewHolder模式。类似这样的

class ViewHolder {
    View firstStar;
    View secondStar;
    ...
}

ViewHolder holder = new ViewHolder();
holder.firstStar = firstStar;
holder.secondStar = secondStar;

fireStar.setTag(holder);
firstStar.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {
        ViewHolder holder = arg0.getTag();
        //update images inside holder,
        //instead of refer 'adapter instance scope field members'.
        holder.firstStar.setImageResource(R.drawable.rated);
    }
}
有一篇关于android中ViewHolder模式的好文章,请查看-

notifyDataSetChanged()
---- 通知附加的观察者基础数据已更改,任何反映数据集的视图都应刷新自身

这意味着任何显示/基于/使用该数据的视图都应该失效(重新测量、重新绘制),以便向用户显示新的数据集

激活结果,reloa
firstStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(1);
            your_adapter.notifyDataSetChanged();
        }