2013-04-11 108 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