我正在创建一个电子商务应用程序,以在listView中显示产品列表。 每个列表项都有一个标题,图像和按钮,分别命名为喜欢,不喜欢和喜欢。
当用户在特定列表项上按下“喜欢”按钮时,该按钮的图像应更改为“喜欢”,并调用特定的API。我已经使用ArrayAdapter类在getView()方法的onClickListener内部完成了此操作。
喜欢这个。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.list_item, parent, false);
likeButton= (Button)
listItemView.findViewById(R.id.like_button);
//likeButton.setClickable(currentProduct.getmLikeButton());
dislikeButton = (Button)
listItemView.findViewById(R.id.dislike_button);
favoritesButton = (Button)
listItemView.findViewById(R.id.favorite_button);
}
TextView productNameView = (TextView)
listItemView.findViewById(R.id.product_name);
ImageView productImageView = (ImageView)
listItemView.findViewById(R.id.product_image);
currentProduct = getItem(position);
likeButton.setTag(position);
dislikeButton.setTag(position);
favoritesButton.setTag(position);
likeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=(Integer)v.getTag();
currentProduct = getItem(position);
productId = currentProduct.getProductId();
likeButton = (Button) v.findViewById(R.id.like_button);
Uri baseUri = Uri.parse(UNBXD_UACTION);
Uri.Builder uriBuilder = baseUri.buildUpon();
uriBuilder.appendQueryParameter("uaction", "like");
uriBuilder.appendQueryParameter("user", "8222");
uriBuilder.appendQueryParameter(PRODUCT_ID,productId);
uriBuilder.appendQueryParameter(MATERIALL, "true");
//uriBuilder.appendQueryParameter(USER_ID, "5");
uriBuilder.appendQueryParameter(UNDO, "false");
Intent intent = new
Intent(Intent.ACTION_WEB_SEARCH, uriBuilder.build());
intent.getData();
likeButton.setBackgroundResource(R.drawable.liked);
Log.v("liked url is ", uriBuilder.toString() + " " +
String.valueOf(position));
}
});
我注意到的问题是,如果我在listView的第一项上单击“ like”按钮,则不仅是第一项的“ like”按钮变为“ liked”,而且每三个listView项目中的“ like”按钮也会变为“ liked”显示为“喜欢”的更改,但API调用仅发生一次且正确地适合于所单击的项目。
我无法弄清楚从我实际按下的like按钮开始如何以及为什么每三个项目的like按钮被按下,但是(幸运的是)只有一个被调用,并且正确的API也被调用。
请帮助。
答案 0 :(得分:0)
那是因为您的视图在public static int numerOfSelfLoops(Graph G)
{
int count = 0;
for (int v = 0; v < G.V(); v++)
for (int w : G.adj(v))
if (v == w) count++;
return count/2;
}
中被回收。当ListView
意味着您获得了回收的视图,则需要再次绑定该视图。
要解决此问题,您可能需要在Product类或适配器或某处中添加新属性,并简化点击侦听器中的操作:
convertView != null
然后使用您的likeButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int position = (Integer)v.getTag();
Product currentProduct = getItem(position);
currentProduct.setLiked(true); // or false
notifyDataSetChanged(); // notify so ListView can update
}
// continue...
方法:
getView