2012-08-05 87 views
0

我有一個列表視圖,當用戶點擊一個項目時,我顯示一個圖像,用戶點擊了這個項目。列表視圖從通知中填充。自定義列表視圖索引自動更改

假設一個項目被添加到listview.Now我點擊該項目和圖像顯示在它的前面。現在當我在列表視圖中輸入新項目什麼都不會發生(現在有兩個項目在列表視圖中)。當我在列表視圖中添加第三個項目時,位置0處的項目中的圖像隱藏並顯示在位置1.爲什麼發生這種情況?

現在要在listview項目中添加圖像。我必須首先對下一次開放活動執行一些檢查,如果這些檢查是成功的,則將該圖像放在該活動中所單擊的項目前面。

所以要做到這一點我所做的是我發送下一個活動中點擊的項目位置,並執行這些檢查,如果這些檢查成功的話,我通過使用該位置在前一活動的onActivityResult函數上進行放置和圖像我發送到此活動。意思是我將該位置值發送回onActivityResult函數中的上一個活動,在該函數中放置圖像。

圖像的位置工作正常。但是,雖然我收到通知,我添加該項目在列表視圖導致getView函數被調用的每個項目在列表視圖再次填充listview.Here問題發生,即圖像從列表中的位置0項目移動到位置1項目。

請詢問是否需要更多解釋或不清楚。

下面是ListView項單擊代碼:

    TextView tv=(TextView)view.findViewById(R.id.clientip); 

        Intent i=new Intent(getApplicationContext(),ChatPageActivity.class); 
        i.putExtra("AdminEmail",ClientListActivity.AdminEmail); 
        i.putExtra("ClientIp",tv.getText().toString()); 
        i.putExtra("ChildAt", position); 

        startActivityForResult(i, 200); 

ChildAt是我送的位置。 在下一個活動中執行檢查之後。

@Override 
protected void onActivityResult(int requestCode,int resultCode,Intent data) 
{ 
    try { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(resultCode!= 23) 
    { 
     Integer integer=data.getExtras().getInt("ChildAt"); 
     ImageView imageView=(ImageView)lv.getChildAt(integer).findViewById(R.id.onlineImg); 
     imageView.setImageResource(R.drawable.online); 
    } 

}catch(Exception e) 
{ 
    Log.e("ClientList_onActivityResult",e.getMessage()); 
} 

} 

這是onActivityResult如果代碼不等於23則意味着在接下來的活動所有的檢查是正確的,你可以在它從下發再次回到這一活動的位置放置圖像活動。

這裏是我的BaseAdapter類的getView代碼:

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

    View view=convertView; 

    if(convertView==null) 
     view=inflater.inflate(R.layout.activeclientlist,null); 

    TextView ip=(TextView)view.findViewById(R.id.clientip); 

    String clientip=this.iplist.get(position); 

    ip.setText(clientip); 


    return view; 
} 

baseADapter我插入現有的使用這段代碼列表視圖項..

this.iplist.add(ip); 
    this.notifyDataSetChanged(); 

重要:
還我想提到的是,這種行爲發生在一個模式,即如我上面所說的,當我插入第三個項目時,圖像位置發生了變化。之後當我添加第五項時,它會再次發生變化等等。

回答

0

您應該將代碼更新到適配器本身的圖像視圖中。

適配器還應該知道他需要繪製數據的所有信息。因此,而不是有它保存字符串列表,保存喜歡的對象的列表:

class Client { 
    String ipAddress; 
    boolean isConnected; 
} 

那麼你必須改變你的適配器:

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

    View view=convertView; 

    if (convertView==null) { 
     view=inflater.inflate(R.layout.activeclientlist,null); 
    } 

    TextView ip=(TextView)view.findViewById(R.id.clientip); 
    ImageView status = (ImageView)view.findViewById(R.id.status); 

    Client c = getItem(position); 


    ip.setText(c.getIpAddress()); 
    status.setImageDrawable(c.isConnected() ? R.drawable.ic_status_connected : 0); 

    return view; 
} 

然後,只需更改代碼更新圖像時連接狀態的變化:

if (resultCode!= 23) { 
    Integer i = data.getExtras().getInt("ChildAt"); 
    ((Client)adapter.getItem(i)).isConnected = true; 
    adapter.notifyDataSetChanged(); 
    } 

這樣,你把所有相關的適配器內時,表示您的數據的代碼。副作用,它應該糾正你的代碼。

也可以查看ViewHolder模式,以避免在有可用的convertView時在每一行上執行findViewById。

+0

thnx的答覆。我試着把'adapter.notifyDataSetChanged()',但它沒有奏效。 – Mj1992 2012-08-05 13:42:12

+0

它將如何解決我的問題?因爲現在我也沒有在'getView'函數中設置ImageView值。我將它設置在click事件上。因此,如果我已經設置了特定索引的項目圖像,則意味着所有其他索引都不會設置。 – Mj1992 2012-08-05 15:06:56

+0

你可以嘗試這種方法(同時學會避免將視圖代碼與控制器代碼混合在一起,這不會是一件壞事),或者堅持使用你的方法。作爲一般規則,不要直接訪問列表中的視圖,在適配器內更好地保證安全。 – 2012-08-06 20:35:40