【问题标题】:ListView: Unable To Change Image on ClickListView:单击时无法更改图像
【发布时间】:2014-03-29 09:53:03
【问题描述】:

一旦用户单击列表项中的图像,我将尝试更改 ListFragment 中的图像。我必须实现一个自定义列表适配器,因为我必须在运行时加载图像。单击图像时列表视图图像会发生变化,但在我滚动列表时,相同位置的其他项目也会发生变化。 请帮忙。

我的适配器代码如下:

public class PeopleAdapter extends BaseAdapter{
private FindPeople activity;
private ArrayList<HashMap<String, String>> data=new ArrayList<HashMap<String,String>>();
private static LayoutInflater inflater=null;
private static boolean imageLoadFinish=false;
private final Object semaphore = new Object();
ImageView thumb_image;
public PeopleAdapter(FindPeople followedActivities, ArrayList<HashMap<String, String>> d) {
    // TODO Auto-generated constructor stub
     activity = followedActivities;

     data.addAll(d);
     inflater = (LayoutInflater)activity.getActivity().getLayoutInflater();//getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}
@Override
public int getCount() {
    // TODO Auto-generated method stub
       return data.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public View getView( final int position,  View convertView, final ViewGroup parent) {
    // TODO Auto-generated method stub
    Log.d("getView", "getView Entered");
    final ViewHolder holder;
    imageLoadFinish=false;
       View vi=convertView;
        if(convertView==null){
            convertView = inflater.inflate(R.layout.found_people_row, null); //This should be your row layout
        holder = new ViewHolder();
        holder.name = (TextView)convertView.findViewById(R.id.Heading); // title
        holder.avatar=(ImageView)convertView.findViewById(R.id.TypeIcon); //image
        holder.favIcon = (ImageView)convertView.findViewById(R.id.followIcon);
        convertView.setTag(holder);
        }else{
             holder = (ViewHolder) convertView.getTag();
        }
        HashMap<String, String> localhash = new HashMap<String, String>();
        localhash = data.get(position);

        String currenttitle = localhash.get("Name");
        String imagepath = localhash.get("avatar");

        holder.name.setText(currenttitle);

        if(!imagepath.equals(""))
        {

            holder.avatar.setImageBitmap(FollowedActivities.memoryCache.get(imagepath));

        }
        holder.favIcon.setTag(position);
        holder.favIcon.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.d("Tag Position", ""+v.getTag());

    holder.favIcon.setImageResource(R.drawable.favorite_512);
            }
        });

        return convertView;
}


static class ViewHolder {
    ImageView avatar;
    TextView name;
    ImageView favIcon;
}

}

【问题讨论】:

    标签: android list android-fragments android-fragmentactivity listadapter


    【解决方案1】:

    在您的getView() 中更改以下内容

    if(!imagepath.equals(""))
    {
    
         holder.avatar.setImageBitmap(FollowedActivities.memoryCache.get(imagepath));
    
    }else
    {
         holder.avatar.setImageBitmap("YOUR DEFAULT IMAGE");
    }
    

    【讨论】:

    • 问题不在于我的头像图像视图。问题出在我的 favIcon 上。同样是图像视图,单击此图标时,图像视图必须更改为 R.drawable.favorite_512。发生了这种变化,但是在向下滚动列表视图时,我发现另一个 favIcon 也更改为 R.drawable.favorite_512,我没有单击它。所以我尝试使用标签,但没有效果。请帮忙
    • 检查@Atul 的解决方案。在我的案例中,我使用了他回答的方法。
    【解决方案2】:

    保留一个布尔变量并在您的 Model 类中默认将其设置为 false(FindPeople - 我猜您从那里获取数据)。

    然后将其添加到您的 HashMap 中,假设为“isClicked”;

    然后在 onClick 方法中检查它的值,然后再分配 favIcon 图像,

    holder.favIcon.setTag(position);
    holder.favIcon.setOnClickListener(new View.OnClickListener() {
    
        @Override
        public void onClick(View v) {            
    
            int position = (Integer) v.getTag(); //This will retrieve your clicked image
    
            HashMap<String, String> localhash = new HashMap<String, String>();
            localhash = data.get(position);
    
            if(!localhash.get("isClicked")){
               holder.favIcon.setImageResource(R.drawable.favorite_512);
            }else{
               //The image was already clicked and changed
            }
        }
    });
    

    试试这个,如果有帮助,请告诉我。

    【讨论】:

    • 不,它没有帮助。当我向下滚动时,我没有选择的项目也会发生变化。还有其他想法吗??
    • 您可以发布您尝试过的内容吗?以防万一少了一小块?
    • holder.favIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO 自动生成的方法 stub int pos = (Integer) v.getTag() ; //这将检索您点击的图像 HashMap localhash = new HashMap(); localhash = data.get(pos); if(!localhash.get("isClicked").equalsIgnoreCase( "true")){ holder.favIcon.setImageResource(R.drawable.favorite_512); }else{ //图片已经被点击更改 } } });
    • 请查看我上面的评论以了解我执行的代码更改,并在我的 Hashmap 中添加了一个新行:rowData.put("isClicked", ""+false);
    • if(!localhash.get("isClicked").equalsIgnoreCase("true")) 它将检查是否为假。将其更改为 if(localhash.get("isClicked").equalsIgnoreCase("true"))。同样,在您更改它之后,将 isClicked 的值更改为 true,这样下次您就不会再这样做了。
    猜你喜欢
    • 2016-07-21
    • 2015-10-25
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多