2014-09-03 59 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... />