【发布时间】:2014-08-12 21:25:40
【问题描述】:
我有一个自定义适配器,在每个项目视图中我都有喜欢和不喜欢按钮。我正在使用 SparseBooleanArray 将整数映射到布尔值。在我的自定义适配器的 getView 中,我定义了这些 SparseBooleanArray:
private final SparseBooleanArray LikedPositions = new SparseBooleanArray();
private final SparseBooleanArray DislikedPositions = new SparseBooleanArray();
然后,根据 API 检索到的数据,我将它们填写如下:
if (Like_with_user == true){
LikedPositions.put(position, true);
}
if (Dislike_with_user == true){
DislikedPositions.put(position, true);
}
在这一步之后,我设置了喜欢和不喜欢按钮的背景:
if(LikedPositions.get(position)){
holder.video_Like.setBackgroundResource(R.drawable.like_pressed);
}else{
holder.video_Like.setBackgroundResource(R.drawable.like_normal);
}
if(DislikedPositions.get(position)){
holder.video_Dislike.setBackgroundResource(R.drawable.dislike_pressed);
}else{
holder.video_Dislike.setBackgroundResource(R.drawable.dislike_normal);
}
在此之后,我将 OnClickListener 设置为喜欢和不喜欢按钮:
holder.video_Like.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View like) {
int likeposition = (Integer) like.getTag(R.string.Position);
RelativeLayout layout = (RelativeLayout) like.getParent();
Button BtnLike = (Button) layout.getChildAt(0);
Button BtnDislike = (Button) layout.getChildAt(1);
if(DislikedPositions.get(likeposition)){
BtnDislike.setBackgroundResource(R.drawable.dislike_normal);
DislikedPositions.delete(likeposition);
System.out.println("Dislike: "+DislikedPositions);
}
if(LikedPositions.get(likeposition)){
BtnLike.setBackgroundResource(R.drawable.like_normal);
LikedPositions.delete(likeposition);
System.out.println("like: "+LikedPositions);
}else{
scale.setDuration(300);
scale.setInterpolator(new OvershootInterpolator());
BtnLike.startAnimation(scale);
BtnLike.setBackgroundResource(R.drawable.like_pressed);
LikedPositions.put(likeposition, true);
System.out.println("like: "+LikedPositions);
}
}
});
问题就在这里,当我单击按钮时,一切正常,添加和删除键! 但是当我滚动列表视图并查看回收时,已删除的键又回来了! 为什么?!
Ps:我将这些标签设置为喜欢和不喜欢按钮:
holder.video_Like.setTag(R.string.Position, position);
holder.video_Like.setTag(R.string.Video_ID, VIDEO_ID);
更新:我的自定义适配器 getview:
private final SparseBooleanArray LikedPositions = new SparseBooleanArray();
private final SparseBooleanArray DislikedPositions = new SparseBooleanArray();
@Override
public View getView(int position, View convertView, ViewGroup parent) {
User_Session = new SessionManagement(mActivity);
View vi = convertView;
ViewHolder holder = null;
HashMap<String, String> mVideo = new HashMap<String, String>();
mVideo = mData.get(position);
VIDEO_URL = mVideo.get("VIDEO_URL");
VIDEO_ID = mVideo.get("VIDEO_ID");
LIKE_W_USER = mVideo.get("LIKE_W_USER");
DISLIKE_W_USER = mVideo.get("DISLIKE_W_USER");
Like_with_user = Boolean.parseBoolean(LIKE_W_USER);
Dislike_with_user = Boolean.parseBoolean(DISLIKE_W_USER);
final String videoUid = mVideo.get("uid");
if(convertView == null) {
vi = mInflater.inflate(R.layout.layout_list_row, null);
holder = new ViewHolder();
holder.video_Like = (Button) vi.findViewById(R.id.video_Like);
holder.video_Dislike = (Button) vi.findViewById(R.id.video_disLike);
vi.setTag(holder);
}else{
holder = (ViewHolder) vi.getTag();
}
holder.video_Like.setTag(R.string.Position, position);
holder.video_Like.setTag(R.string.Video_ID, VIDEO_ID);
holder.video_Dislike.setTag(R.string.Position, position);
holder.video_Dislike.setTag(R.string.Video_ID, VIDEO_ID);
if(User_Session.isLoggedIn() != true){
holder.video_Comment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LoginWarn();
}
});
holder.video_Like.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LoginWarn();
}
});
holder.video_Dislike.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LoginWarn();
}
});
}else{
HashMap<String, String> user = User_Session.GetUserDetails();
final String User_TOKEN = user.get(SessionManagement.KEY_USERTOKEN);
if (Like_with_user == true){ // Check that user liked this video before or not
LikedPositions.put(position, true);
}
if (Dislike_with_user == true){ // Check that user disliked this video before or not
DislikedPositions.put(position, true);
}
if(LikedPositions.get(position)){ // Highlight Like Sign if user liked it before
holder.video_Like.setBackgroundResource(R.drawable.like_pressed);
}else{
holder.video_Like.setBackgroundResource(R.drawable.like_normal);
}
if(DislikedPositions.get(position)){ // Highlight dislike Sign if user disliked it before
holder.video_Dislike.setBackgroundResource(R.drawable.dislike_pressed);
}else{
holder.video_Dislike.setBackgroundResource(R.drawable.dislike_normal);
}
holder.video_Like.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int position = (Integer) v.getTag(R.string.Position);
RelativeLayout layout = (RelativeLayout) v.getParent();
Button BtnLike = (Button) layout.getChildAt(0);
Button BtnDislike = (Button) layout.getChildAt(1);
Ion.with(mActivity).load(Constants.Like_URL+v.getTag(R.string.Video_ID)+"/?token="+User_TOKEN).asString()
.setCallback(new FutureCallback<String>(){
@Override
public void onCompleted(Exception e, String result) {
if(e != null){
Toast.makeText(mActivity, "Sorry, Error Happened", Toast.LENGTH_SHORT).show();
}
}
});
if(DislikedPositions.get(position)){
BtnDislike.setBackgroundResource(R.drawable.dislike_normal);
DislikedPositions.delete(position);
}
if(LikedPositions.get(position)){
BtnLike.setBackgroundResource(R.drawable.like_normal);
LikedPositions.delete(position);
}else{
scale.setDuration(300);
scale.setInterpolator(new OvershootInterpolator());
BtnLike.startAnimation(scale);
BtnLike.setBackgroundResource(R.drawable.like_pressed);
LikedPositions.put(position, true);
}
}
});
holder.video_Dislike.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int position = (Integer) v.getTag(R.string.Position);
RelativeLayout layout = (RelativeLayout) v.getParent();
Button BtnLike = (Button) layout.getChildAt(0);
Button btnDislike = (Button) layout.getChildAt(1);
Ion.with(mActivity).load(Constants.Dislike_URL+v.getTag(R.string.Video_ID)+"/?token="+User_TOKEN).asString()
.setCallback(new FutureCallback<String>(){
@Override
public void onCompleted(Exception e, String result) {
if(e != null){
Toast.makeText(mActivity, "Sorry, Error Happened", Toast.LENGTH_SHORT).show();
}
}
});
if(LikedPositions.get(position)){
BtnLike.setBackgroundResource(R.drawable.like_normal);
LikedPositions.delete(position);
}
if(DislikedPositions.get(position)){
btnDislike.setBackgroundResource(R.drawable.dislike_normal);
DislikedPositions.delete(position);
}else{
scale.setDuration(300);
scale.setInterpolator(new OvershootInterpolator());
btnDislike.startAnimation(scale);
btnDislike.setBackgroundResource(R.drawable.dislike_pressed);
DislikedPositions.put(position, true);
}
}
});
}
// we're near the end of the list adapter, so load more items
if (position >= getCount() - 1){
mSwipe.setRefreshing(true);
loadmore();
}
return vi;
}
【问题讨论】:
-
请显示您的 getView 方法的完整代码。听起来你没有正确处理它。另外,当一个人可以很容易地做同样的事情时,为什么还要有两个 SparseArrays?
-
@JaySoyer 我添加了,请查看。
-
在您的
getView()方法中,您究竟在哪里设置SparseBooleanArrays的状态? -
@Luksprog,首先在API派生的
Like_with_user == true和Dislike_with_user == true语句中,其次是当喜欢按钮或不喜欢按钮点击时。 -
在 OnClickListeners 中获取对 mVideo Hashmap 的引用并更新该行的
LIKE_W_USER键的值。
标签: android listview android-listview