在ListView和自定义适配器中更改按钮背景

时间:2014-09-03 08:52:13

标签: android listview android-adapter

我是新手,所以我希望这不是一个荒谬的问题...... 我有一个列表视图,所有项目包括视频,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;
}

}

4 个答案:

答案 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);