2014-02-24 42 views
2

我有一個列表視圖與每行上的圖像現在我想要的是我想改變該圖像onclick,現在如果它是兩個圖像,它會很簡單。我可以使用布爾值並設置項目圖像的位置進行更改。 但我的案件涉及兩個以上的圖像 1日點擊圖像更改爲image0 月2點擊圖像更改爲image1的 3日點擊圖像更改爲鏡像2 和4日點擊圖片變回圖像 和圖像的切換相當優良但一旦重新加載列表時,所有更改都會隨着切換的圖像位置從0更改爲8等等。我嘗試設置默認行爲。 所以,這裏是我的示例代碼我怎麼能切換超過三個圖像在列表視圖android

 @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的代碼是在這裏 私人字符串狀態= 「」;

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.Just想現在如何知道狀態位置指示器嘗試我可以停止改變listview重新加載時切換圖像的位置。 幫幫忙。

+0

檢查我剛剛發佈了答案初始化它,希望它有助於 –

+0

@HassaanRabbani不需要這樣的評論。他會爲每個新帖發送一個通知,所以不需要做一個「看看」的評論讓他知道兩次...... – WarrenFaith

回答

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); 
    } 
... 
} 

編輯

我假設你正在使用的自定義對象yoour listItems中。所以這裏

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(「」)進行比較字符串。

+0

你可以給出一個關於imagestate如何在模型中製作的提示,它將如何工作onclick和getview? – user3345662

+0

我可以切換圖像,但在列表重新加載item1處的item1點擊時,情況會變得更糟,等等。 – user3345662

+0

常見的陷阱:使用我在我的答案中提到的默認值。並將此默認情況下的圖像設置爲null或任何它應該是。你知道列表視圖recyles的意見和一些意見返回給你設置與另一個圖像之前,它可以回收 – Ercan

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; 
} 
+0

它將如何工作的所有項目在列表視圖,我想改變圖像click.o,它將如何工作? – user3345662

+0

您可以在您的onClick方法中添加此代碼,並更改相應的圖像。如果先點擊,然後標誌= 1,如果再次點擊標誌= 2,則更改該圖像等等 –

+0

但是當列表重新加載仍然存在時出現問題 – user3345662