2013-04-11 104 views
0

我有一個ListView,其中顯示了一些產品。我使用擴展BaseAdapter類的對象來填充ListView,使用getView(..)方法更加簡潔。我在每個itemView上都有一個TextView「鏈接」,如果用戶點擊它,它將進入一個網頁。在我的基礎適配器中,只有當我的產品包含鏈接時,我纔在TextView上設置一個偵聽器。 我已經在我的getView(..)方法中進行了調試,並且它都可以正常工作,但是在它退出getView方法後,如果有一個項目沒有鏈接,它將從另一個項目中獲取鏈接/偵聽器從listView。爲什麼來自適配器getView(..)方法的條件不適用於ListView

適配器類別:

public class MatchListBaseAdapter extends BaseAdapter { 

private static ArrayList<Match> matchesArrayList; 
private LayoutInflater l_Inflater; 
private OnClickListener onClickListener; 


public MatchListBaseAdapter(Context context, View.OnClickListener listener, ArrayList<Match> results,Activity a) { 
    matchesArrayList = results; 
    onClickListener = listener; 
    l_Inflater = LayoutInflater.from(context); 
} 

public int getCount() { 
    return matchesArrayList.size(); 
} 

public Object getItem(int position) { 
    return matchesArrayList.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = l_Inflater.inflate(R.layout.itemlist_match, null); 
     holder = new ViewHolder(); 

     holder.name = (TextView) convertView.findViewById(R.id.oferNameMLI2); 
     holder.expireDate = (TextView) convertView.findViewById(R.id.expireDateMLI); 
     holder.price = (TextView) convertView.findViewById(R.id.priceMLI); 
     holder.companyName = (TextView) convertView.findViewById(R.id.compNameMLI); 
     holder.productImage = (ImageView) convertView.findViewById(R.id.productImageMLI); 
     holder.companyImage = (ImageView) convertView.findViewById(R.id.companyImageMLI); 
     holder.description = (TextView) convertView.findViewById(R.id.moreDetailsMLI); 
     holder.digitalySigned = (ImageView) convertView.findViewById(R.id.digitalSignatureImageView); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

     //populating the holder.. doesn`t have any relevance.. 

    if(matchesArrayList.get(position).getCompanyLink() != null){ 
     holder.companyImage.setOnClickListener(onClickListener); 
     holder.companyImage.setTag(position); 
    } 

    return convertView; 
} 

static class ViewHolder { 

    TextView name; 
    TextView expireDate; 
    TextView price; 
    TextView companyName; 
    TextView description; 
    ImageView productImage; 
    ImageView companyImage; 
    ImageView digitalySigned; 
} 

}

活動的onCreate:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.listview_layout); 

    matches = DataManager.getInstance().getListSubscription().get(DataManager.getInstance().getSubscriptionPosition()).getMatchesList(); 

    ListView lv1 = (ListView) findViewById(R.id.listView_layout); 
    DataManager.getInstance().setAdapterMatch(new MatchListBaseAdapter(this, this, matches,this)); 
    lv1.setAdapter(DataManager.getInstance().getAdapterMatch()); 

} 

只是想再次強調,我已經做了在getView調試(..)提方法,它是好的,流量是正確的,但在the items in the listView that doesn't supposed to have a listener on the TextView it had from the other items.

Also this happens always for the first item in the listView .. and it is populated with the link from the last item in the listView that contains a link.

我搜索很多關於這個問題,但沒有發現任何有關,但我覺得有我convertView一個問題,但我不能老是看着辦吧..

THX很多

+1

'如果(!matchesArrayList.get(位置).getCompanyLink()= NULL){...}'...你要高度重視閱讀有關適配器重用的意見.. 。那麼你會知道你應該添加'else {....}'代碼... – Selvin 2013-04-11 14:30:24

+0

添加了'else {..}'並且同樣的問題... – 2013-04-11 14:46:38

+0

你在'else'中添加了什麼。 ..你應該把'null'放在'companyImage'的點擊監聽器和標籤上...... – Selvin 2013-04-11 14:49:35

回答

0

問題是,當您重新使用視圖並且未對其設置明確的onClickListener時,它仍包含來自另一產品的舊偵聽器 - 來自重用視圖。嘗試進行更改如下:

if(matchesArrayList.get(position).getCompanyLink() != null){ 
    holder.companyImage.setOnClickListener(onClickListener); 
    holder.companyImage.setTag(position); 
} 
else { 
    holder.companyImage.setOnClickListener(null); 
} 
+0

是的..這工作完美:)非常感謝! ...這個問題稍微複雜一些,因爲我不僅對上面的聽衆有這個問題,而且對於某些應該顯示默認圖片的圖片而言,這個問題反而被覆蓋了。我還將null傳遞給加載了else語句上的圖片的asynkTasks,事實證明確定:)再次感謝! – 2013-04-11 15:37:56