2014-09-03 60 views
0

我是新东西,所以我希望它不是一个荒谬的问题... 我有一个列表视图,所有项目包括视频,numOfLikes(textview),喜欢和不喜欢(纽扣)。 当我点击喜欢或不喜欢按钮时,我尝试更改按钮的背景,但它会更改列表视图中所有喜欢/不喜欢按钮的背景。更改ListView和CustomAdapter中的按钮背景

当我尝试启用不喜欢按钮的同时,当我点击类似按钮时,会禁用列表中的所有不喜欢按钮。

代码:

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; 
} 

} 

回答

1

您必须从未更改onClick事件ListView项查看其属性。

的原因是onClick事件被调用了在不同的时间getView方法和因ListView那些受影响的属性将被应用到回收的意见回收体系,让您得到不相关的结果。

相反,你必须在性能

boolean[] buttonState; 

存储在数组中,然后在getView方法使用数组属性应用到的意见......

Adapter类在constructor

buttonState = new boolean[feeds.size()]; 

onClick

buttonState[position] = false; // or true... 

getView

holder.yourButton.setEnabled(buttonState[position]); 
+0

谢谢!你帮了我很多! – OShiffer 2014-09-03 11:15:04

+0

很高兴帮助。欢迎您:) – semsamot 2014-09-03 12:18:22

+0

它不会对getView中的setEnabled应用任何更改 – 2017-05-08 11:21:58

0

onClick(View v)通过它的点击,你可以用它来更改按钮属性Button对象。

public void onClick(View v) { 
    Button b = ((Button)v); 
    b.setEnabled(false); 
} 

你可以设置你的XML布局内的Buttonbackground财产。甚至你可以定义绘制XML slector女巫将定义不同的背景像不同的状态:按下,突出重点,残疾人等 首先,你必须定义XML选择并设置为按钮背景:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@color/selected" android:state_pressed="true"/> 
    <item android:drawable="@color/selected" android:state_selected="true"/> 
    <item android:drawable="@android:color/transparent"/> 
</selector> 

的颜色相反您可以使用绘图资源(图像或形状)。你也可以在这个列表中定义不同的状态。将使用选择器女巫匹配当前satte中的第一个元素。

0

尝试 -

likeButton.setBackgroundColor(R.color.transparent); 
unlikeButton.setEnabled(false); 
+0

我认为这将是对OP和进一步游客更有帮助,当你添加一些交代你的内涵。 – reporter 2014-09-03 09:45:09

1

作为一个变体,您可以创建自定义按钮扩展按钮,并实现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(如在我的例子),你也可以使用绘制状态列表或构造与对应的可绘为附加参数。

您可以使用XML这个自定义类完整的包名状

<my.own.project.package.CustomButton... />