RecyclerView在扩展CardView Android上显示奇怪的行为

时间:2015-02-25 09:32:50

标签: android android-recyclerview

<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"     
android:layout_height="wrap_content">      
<RelativeLayout         
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingTop="@dimen/activity_horizontal_margin"
    android:background="@android:color/transparent">          
    <TextView             
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="@string/string_for_newsletter"
          android:paddingLeft="16dp"
          android:id="@+id/textQuestion"/>          
          <ImageButton             
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:src="@drawable/bookmark_star"
              android:layout_alignParentRight="true"
              android:background="@android:color/transparent"
              android:layout_alignParentBottom="true"
              android:id="@+id/bookmarkButton"/>          
         <TextView             
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_below="@id/textQuestion"
              android:text="answer"             
              android:paddingLeft="16dp"
              android:paddingTop="16dp"  
              android:textColor="#00ff00" 
              android:visibility="gone" 
              android:id="@+id/textAnswer"/>      
     </RelativeLayout>  

这是我的卡片视图布局 以下是RecyclerView Adapter的代码     包com.example.user_2.tcc_app.QuestionAnswer;

import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;

import com.example.user_2.tcc_app.R;

/**
   * Created by USER-2 on 23-Feb-15.
*/
public class QuestionAnswerAdapter extends    RecyclerView.Adapter<QuestionAnswerAdapter.QuestionAnswerAdapterViewHolder>{

    int length;
    int layout_id;
    public long item_id;

       public QuestionAnswerAdapter(int length, int id_for_layout){
        this.length = length;
         this.layout_id = id_for_layout;
       }
      @Override
      public QuestionAnswerAdapterViewHolder onCreateViewHolder(ViewGroup  parent, int viewType) {
           View root = LayoutInflater.from(parent.getContext()).inflate(layout_id, parent, false);
          QuestionAnswerAdapterViewHolder questionAnswerAdapterViewHolder = new QuestionAnswerAdapterViewHolder(root);
           return questionAnswerAdapterViewHolder;
}

         @Override
             public void onBindViewHolder(final            QuestionAnswerAdapterViewHolder holder, int position) {
}

         @Override
         public int getItemCount() {
         return length;
        }

        public class QuestionAnswerAdapterViewHolder extends  RecyclerView.ViewHolder{
               TextView textQuestion;
               ImageButton bookmarkButton;
               TextView textAnswer;

               public QuestionAnswerAdapterViewHolder(View v){
               super(v);
                 textQuestion = (TextView)v.findViewById(R.id.textQuestion);
                  bookmarkButton = (ImageButton)v.findViewById(R.id.bookmarkButton);
                  textAnswer = (TextView)v.findViewById(R.id.textAnswer);
                textQuestion.setOnClickListener(new View.OnClickListener() {
             @Override
                public void onClick(View v) {
                    textAnswer.setVisibility(View.GONE);
              }
        });
    }
}

}

我在recyclerview中有10个项目。我希望在单击textQuestion时显示带有text textAnswer的textview,并且每件事情都工作正常,但是当我向下滚动时,我可以看到第九项也有textAnswer字段可见。我可以理解,这是因为onBindViewHolder方法作为recyclerView,而回收其项目时使用以前不可见的可见项目。但我不知道如何解决它。有人请帮忙

1 个答案:

答案 0 :(得分:1)

RecyclerView重新使用ViewHolders,因此诀窍是在onBindViewHolder()方法中将可扩展区域设置为VISIBLE / GONE。希望你现在解决了你的问题,但对于遇到像我这样的类似问题的人来说,这是一个功能性的例子:

带有可消费卡片视图的适配器示例:

public class FooAdapter extends RecyclerView.Adapter<FooAdapter.ViewHolder> {

List<LightGroup> mFoos;
List<Boolean> mExpandedFoos;

public GroupAdapter(List<Foo> Foos) {
    mFoos = foos;
    mExpandedFoos = new ArrayList<>(mFoos.size());
    for(int i = 0; i < mGroups.size(); i++){
        mExpandedFoos.add(false);
    }
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.foo_row, parent, false);

    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    if(mExpandedFoos.get(position)) {
        holder.expandableLayout.setVisibility(View.VISIBLE);
    } else {
        holder.expandableLayout.setVisibility(View.GONE);
    }

    Foo foo = mFoos.get(position);
    holder.fooName.setText(foo.getName());
    //Setup the rest of your row views from your Foo object
}

@Override
public int getItemCount() {
    return mFoos == null ? 0 : mFoos.size();
}

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    TextView fooName;
    ViewGroup expandableLayout;
    ImageButton expandButton;

    public ViewHolder(View itemView) {
        super(itemView);
        fooName = (TextView) itemView.findViewById(R.id.foo_name_textview);
        expandableLayout = (ViewGroup) itemView.findViewById(R.id.expandable_part_layout);
        expandButton = (ImageButton) itemView.findViewById(R.id.foo_row_expand_button);
        expandButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int position = getAdapterPosition();

        if(v.getId() == expandButton.getId()){
            if(mExpandedFoos.get(position)) {
                expandableLayout.setVisibility(View.GONE);
            } else {
                expandableLayout.setVisibility(View.VISIBLE);
            }
            mExpandedFoos.set(position, !mExpandedFoos.get(position));
        }
    }
}
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="4dp"
app:cardPreventCornerOverlap="false"
android:background="@android:color/background_dark"
android:layout_marginBottom="8dp">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:id="@+id/top_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="false"
        android:layout_alignParentTop="true">

        <TextView
            android:id="@+id/foo_name_textview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingStart="@dimen/activity_horizontal_margin"
            android:paddingEnd="@dimen/activity_horizontal_margin"
            android:gravity="center"/>

        <ImageButton
            android:id="@+id/foo_row_expand_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:background="?android:selectableItemBackground"
            android:clickable="true"
            android:padding="6dp"
            android:rotation="90"
            android:src="@drawable/ic_play_light" />


    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/expandable_part_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/top_layout"
        android:animateLayoutChanges="true"
        android:clickable="false"
        android:visibility="gone">


        <!-- Your expanded content views go here -->


    </RelativeLayout>
</RelativeLayout>
</android.support.v7.widget.CardView>