我如何在listview android中切换三个以上的图像

时间:2014-02-24 08:19:29

标签: android android-layout android-listview

我有一个列表视图,每行上都有一个图像现在我想要的是我想要改变那个图像onclick,现在如果它是两个图像就会非常简单。我可以使用布尔值并设置项目的位置& #39;要更改的图像。 但我的情况涉及两个以上的图像 在第一次单击图像更改为image0 第二次单击图像更改为image1 第3次单击图像更改为image2 并在第4次点击图像更改回图像 并且图像切换非常精细但是一旦重新加载列表,一切都会随着切换图像位置从0变为8而改变,依此类推。我也试过设置默认行为。 所以,这是我的示例代码

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

    View vi=convertView;


    if(convertView==null){ 

        /********** Inflate tabitem.xml file for each row ( Defined below ) ************/
        vi = inflater.inflate(R.layout.tabitem, null); 

        /******** View Holder Object to contain tabitem.xml file elements ************/
        holder=new ViewHolder();
        holder.text=(TextView)vi.findViewById(R.id.text);
        holder.text1=(TextView)vi.findViewById(R.id.text1);
        holder.image=(ImageView)vi.findViewById(R.id.image);
        holder.image.setOnClickListener(this);
        holder.image.setTag(position);

       /************  Set holder with LayoutInflater ************/
        vi.setTag(holder);
    }
    else  
        holder=(ViewHolder)vi.getTag();

    if(data.size()<=0)
    {
        holder.text.setText("No Data");

    }
    else
    {
        /***** Get each Model object from Arraylist ********/

        tempValues = (ListModel) data.get(position);

        Log.i("Mainly at", Integer.toString(position)+"state is "+tempValues.getStatus());
        /************  Set Model values in Holder elements ***********/
         holder.text.setText(tempValues.getCompanyName());
         holder.text1.setText(tempValues.getUrl());


            // holder.image.setImageResource(R.drawable.image0);
         if(tempValues.getStatus().equals(ListModel.imageStateNone))
         {
             holder.image.setImageResource(R.drawable.image0);
         }

         if(tempValues.getStatus().equals(ListModel.imageStateAnotherCase))
         {


         if(tempValues.getImageStateAtPos()==0){
             holder.image.setImageResource(R.drawable.image0);// or what it should be in default
        }


         if(tempValues.getImageStateAtPos()==1){
             holder.image.setImageResource(R.drawable.plus);// or what it should be in default
        }

         if(tempValues.getImageStateAtPos()==2){
             holder.image.setImageResource(R.drawable.minus);// or what it should be in default
        }


         }


         /******** Set Item Click Listner for LayoutInflater for each row ***********/
 //        vi.setOnClickListener(new OnItemClickListener(position));
    }
    return vi;
}

@Override
public void onClick(View v) {
    int position = (Integer)v.getTag();
    tempValues.setStateAsChange();
       Log.e("clicked at", Integer.toString(tempValues.getImageStateAtPos())+"Changed state is "+tempValues.getStatus()+"And position"+Integer.toString(position));
       tempValues.setImageStateAtPos(tempValues.getImageStateAtPos()+1);

       if(tempValues.getImageStateAtPos()>2){
           tempValues.setImageStateAtPos(0);
       }
   //    holder.image.setImageResource(R.drawable.plus);
        LinearLayout rl = (LinearLayout)v.getParent();
        holder.image = (ImageView)rl.getChildAt(0);
     //   ((ImageView) v).setImageResource(R.drawable.plus);
        if(tempValues.getImageStateAtPos()==0){
             holder.image.setImageResource(R.drawable.image0);// or what it should be in default
        }


         if(tempValues.getImageStateAtPos()==1){
             holder.image.setImageResource(R.drawable.plus);// or what it should be in default
        }

         if(tempValues.getImageStateAtPos()==2){
             holder.image.setImageResource(R.drawable.minus);// or what it should 
        }
         if(tempValues.getImageStateAtPos()==3){
             holder.image.setImageResource(R.drawable.image10);
        }



}


 }

ListModel代码在这里     private String status =&#34;&#34;;

  public static final String imageStateNone="none"; 
  public static final String imageStateAnotherCase="changed"; 
 private int state;
/****
     HashMap<Integer, String> set=new HashMap<Integer, String>();

  public void setStateAsnone(int pos)
    {
set.put(pos,imageStateNone );
 }


  public void setStateAsChange(int pos)
{
set.put(pos, imageStateAnotherCase);
//this.status = imageStateAnotherCase;
   }

 public String getStatus(int pos)
  {
return set.get(pos);
  }



 public void setImageStateAtPos(int state){
this.state=state;
 }

 public int getImageStateAtPos(){
return state;
 }





public void setStateAsnone()
{
    this.status = imageStateNone;
}


public void setStateAsChange()
{
    this.status = imageStateAnotherCase;
}

public String getStatus()
{
    return status;
}

最后在mainactivity中添加数据

    for (int i = 0; i < 11; i++) {

        final ListModel sched = new ListModel();

          /******* Firstly take data in model object ******/
           sched.setCompanyName("Company "+i);
           sched.setImage("image"+i);
           sched.setUrl("http:\\\\www."+i+".com");
           sched.setImageStateAtPos(0);
           sched.setStateAsnone();
        /******** Take Model Object in ArrayList **********/
        CustomListViewValuesArr.add(sched);
    }

enter code here

一切都像魅力一样,直到列表重新加载当列表重新加载尝试使用状态位置指示器使用hashmap时,一切都搞砸了。现在我想知道如何在重新加载listview时停止更改图像切换的位置。 帮忙。

2 个答案:

答案 0 :(得分:1)

在ListModel对象中放入一个数据,表示绑定到它的行项是否发生了变化。然后将此语句添加到getView()这样的内容中:

getView(){

    if(model.getImageSate()==ImageState.NONE){
         holder.image.setImageResource(R.drawable.image);// or what it should be in default
    }
    if(model.getImageSate()==ImageState.YetAnotherState){,
          holder.image.setImageResource(R.drawable.theOtherImage);
    }
...
}

修改

我假设您正在为ListItem使用自定义对象。所以这里

    class ListModel{

    // you may use a String variable or an enumeration for this. ill use a
    string field for this example: 

     public static final String imageStateNone="none"; 
     public static final String imageStateAnotherCase="anothercase"; 
     private String imageState;

     //getter - setter for imageState field

     }

如果您使用sdk或其他库中的预定义类。 继承它并把你的变量放在这样:

class ExtendedObject extends ListModel{


     public static final String imageStateNone="none"; 
     public static final String imageStateAnotherCase="anothercase"; 
     private String imageState;

     //getter - setter for imageState field



}

不要忘记使用string.equals(“”)来比较字符串。

答案 1 :(得分:0)

好的,这是非常简单和正统的做法。

创建一个整数变量。并用0初始化它。

Public int flag = 0;

If(flag==0)
{
    // change to image 2
       flag=flag+1;
} else if (flag==1)
{
    // change to image 3
       flag=flag+1;
} else if (flag==2)
{
    // change to image 4
       flag=0;
}