我是新手,所以我希望这不是一个荒谬的问题...... 我有一个列表视图,所有项目包括视频,numOfLikes(textview),喜欢和不喜欢(按钮)。 当我点击喜欢或不喜欢按钮时,我尝试更改按钮的背景,但它会更改列表视图中所有喜欢/不喜欢按钮的背景。
当我在点击“赞”按钮时尝试启用不喜欢按钮时会发生同样的情况,它会禁用列表中的所有不喜欢按钮。
代码:
public class FeedAdapter extends ArrayAdapter<Feed> {
Context context;
ArrayList<Feed> feedsList;
ArrayList<String> listOfItems;
Dialog dialog;
public FeedAdapter(Context context, int resource, ArrayList<Feed> feeds) {
super(context, resource, feeds);
this.context = context;
this.feedsList = feeds;
}
public FeedAdapter(Context context, ArrayList<Feed> feeds){
super(context, R.layout.feed_listitem, feeds);
this.context = context;
this.feedsList = feeds;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final FeedHolder holder;
if(convertView == null){
convertView = LayoutInflater.from(context).inflate(R.layout.feed_listitem, parent, false);
holder = new FeedHolder();
holder.titleTextView = (TextView) convertView.findViewById(R.id.feed_title_textView);
holder.usernameTextView = (TextView) convertView.findViewById(R.id.feed_name_textview);
holder.likesTextView = (TextView) convertView.findViewById(R.id.feed_likes_textview);
holder.likeButton = (Button) convertView.findViewById(R.id.feed_like_button);
holder.unlikeButton = (Button) convertView.findViewById(R.id.feed_unlike_button);
holder.video = (VideoView) convertView.findViewById(R.id.feed_post_videoView);
holder.frameLayout = (FrameLayout) convertView.findViewById(R.id.feed_placeholder_framelayout);
holder.frameLayout.setTag(holder.video);
holder.likeButton.setTag(holder.unlikeButton);
holder.unlikeButton.setTag(holder.likeButton);
convertView.setTag(holder);
} else{
holder = (FeedHolder) convertView.getTag();
holder.frameLayout.setTag(holder.video);
holder.likeButton.setTag(holder.unlikeButton);
holder.unlikeButton.setTag(holder.likeButton);
}
holder.titleTextView.setText(feedsList.get(position).getTitle());
holder.usernameTextView.setText(feedsList.get(position).getUsername());
holder.likesTextView.setText(TrendliContract.showNumInNumK(feedsList.get(position).getLikesInLong()));
holder.titleTextView.setTypeface(TrendliContract.helvetica);
holder.usernameTextView.setTypeface(TrendliContract.helvetica);
holder.likesTextView.setTypeface(TrendliContract.helvetica);
holder.frameLayout.setBackground(feedsList.get(position).getDrawable());
holder.video.setVisibility(View.INVISIBLE);
holder.video.setMediaController(new MediaController(context));
holder.video.setVideoURI(Uri.parse(feedsList.get(position).getVideoImageGif()));
holder.video.setLayoutParams(new FrameLayout.LayoutParams(TrendliContract.screenW,
TrendliContract.screenW));
postImageViewOnClickListener(holder);
holder.likeButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Feed f = feedsList.get(position);
//Button b = ((Button) v.getTag());
if(f.isLikePressed() == false){
new TrendliContract.Like().execute(f);
f.setLikePressed(true);
int numOfLikes = Integer.parseInt(holder.likesTextView.getText().
toString().replace(" ", ""));
holder.likesTextView.setText(String.valueOf(++numOfLikes));
//v.setBackgroundColor(R.color.black);
//b.setEnabled(false);
} else{
new TrendliContract.UnLike().execute(f);
f.setLikePressed(false);
int numOfLikes = Integer.parseInt(holder.likesTextView.getText().
toString().replace(" ", ""));
holder.likesTextView.setText(String.valueOf(--numOfLikes));
//v.setBackgroundColor(R.color.transparent);
//b.setEnabled(true);
}
}
});
holder.unlikeButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Feed f = feedsList.get(position);
//Button b = ((Button) v.getTag());
if(f.isDislikePressed() == false){
new TrendliContract.DisLike().execute(f);
f.setDislikePressed(true);
int numOfLikes = Integer.parseInt(holder.likesTextView.getText().toString().replace(" ", ""));
holder.likesTextView.setText(String.valueOf(--numOfLikes));
//v.setBackgroundColor(R.color.black);
//b.setEnabled(false);
} else{
new TrendliContract.UnDisLike().execute(f);
f.setDislikePressed(false);
int numOfLikes = Integer.parseInt(holder.likesTextView.getText().toString().replace(" ", ""));
holder.likesTextView.setText(String.valueOf(++numOfLikes));
//v.setBackgroundColor(R.color.transparent);
//b.setEnabled(true);
}
}
});
convertView.setTag(holder);
return convertView;
}
private class FeedHolder{
TextView titleTextView;
TextView usernameTextView;
TextView likesTextView;
Button likeButton;
Button unlikeButton;
VideoView video;
FrameLayout frameLayout;
}
}
答案 0 :(得分:1)
您必须永远更改ListView
事件中onClick
项目视图的属性。
原因是onClick
事件在不同的时间内被getView
方法调出,并且由于ListView
的回收系统,这些受影响的属性将应用于回收的视图,因此你会得到无关紧要的结果。
相反,您必须将属性存储在数组中,然后在getView
方法中使用该数组将属性应用于视图...
在Adapter
班级
boolean[] buttonState;
在constructor
:
buttonState = new boolean[feeds.size()];
在onClick
:
buttonState[position] = false; // or true...
在getView
:
holder.yourButton.setEnabled(buttonState[position]);
答案 1 :(得分:1)
作为变体,您可以创建自定义按钮类extends Button并实现View.OnClickListener,然后覆盖它的onClick方法以设置与mPressed等标志对应的背景。之后,您可以将此类用于您的按钮。这是自定义按钮类的示例:
public class CustomButton extends Button implements View.OnClickListener {
private boolean mPressed = false;
private static final int mRegularBackID = R.drawable.button_up;
private static final int mPressedBackID = R.drawable.button_down;
public CustomButton( Context context ) {
super( context );
}
public CustomButton( Context context, AttributeSet attrs ) {
super( context, attrs );
}
public CustomButton( Context context, AttributeSet attrs, int defStyle ) {
super( context, attrs, defStyle );
}
@Override
public void onClick( View view ) {
mPressed = !mPressed;
this.setBackgroundResource( mPressed ? mPressedBackID : mRegularBackID );
}
}
除了带有标志的静态可绘制ID(如我的例子中),您还可以使用可绘制状态列表或带有相应drawable的构造函数作为附加参数。
您可以在XML中使用此自定义类,并使用完整的包名称,如
<my.own.project.package.CustomButton... />
答案 2 :(得分:0)
在onClick(View v)
中传递的视图点击了Button对象,您可以使用它来更改Button属性。
public void onClick(View v) {
Button b = ((Button)v);
b.setEnabled(false);
}
您可以在xml布局中设置background
的{{1}}属性。即使你可以定义可绘制的xml slector女巫将为不同的状态定义不同的背景,如:按下,聚焦,禁用等。
首先,您必须定义选择器xml并将其设置为Button background:
Button
您可以使用可绘制资源(图像或形状)代替颜色。您还可以在此列表中定义不同的状态。将使用选择器中匹配当前satte的第一个元素。
答案 3 :(得分:0)
尝试 -
likeButton.setBackgroundColor(R.color.transparent);
unlikeButton.setEnabled(false);