1

私はデータベースからデータを取り出し、cardViewを作成するコードをいくつか作成しました。 cardViewの行には、カードがクリックされたときに有効にしてビューを展開するための、隠れた(消えた)textViewがあります。 これは問題なく動作しているようですが、何らかの理由でアイテム1だけでなく、別のアイテムも展開しています。ここでRecycleview複数のitermsを展開する

は私のアダプタが

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.TextView; 

import com.blackout.kfzquiz.model.Product; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by Sundown on 01/10/2016. 
*/ 

public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder> { 
    private String[] kennzeichen_array; 
    private String[] stadt_array; 
    private int length; 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    public static class ViewHolder extends RecyclerView.ViewHolder{ 
     //each data item is just a string in this case 
     public TextView kennzeichen; 
     public TextView hiddenTextView; 

     public ViewHolder(View v){ 
      super(v); 
      kennzeichen = (TextView) v.findViewById(R.id.tv); 
      hiddenTextView = (TextView) v.findViewById(R.id.textView8); 
     } 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public MyAdapter2(List<Product> myItems){ 
     length = myItems.size(); 

     String[] mStrings = new String[myItems.size()]; 
     String[] stadtStrings = new String[myItems.size()]; 
     for(int i=0;i<myItems.size();i++) { 
      mStrings[i] = myItems.get(i).getkfz(); 
      stadtStrings[i] = myItems.get(i).getStadt(); 
     } 
     kennzeichen_array = mStrings; 
     stadt_array = stadtStrings; 

    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public MyAdapter2.ViewHolder onCreateViewHolder(ViewGroup parent, 
                int viewType) { 
     // create a new view 
     LayoutInflater inflater = LayoutInflater.from(
       parent.getContext()); 
     View v = 
       inflater.inflate(R.layout.my_text_view, parent, false); 

     // set the view's size, margins, paddings and layout parameters 
     MyAdapter2.ViewHolder vh = new MyAdapter2.ViewHolder(v); 
     return vh; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(final MyAdapter2.ViewHolder holder, final int position) { 
     // - get element from your dataset at this position 
     // - replace the contents of the view with that element 
     holder.kennzeichen.setText(kennzeichen_array[position]); 
     holder.hiddenTextView.setText(stadt_array[position]); 

     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d("Clicked", String.valueOf(holder.getAdapterPosition())); 
       if (holder.hiddenTextView.getVisibility() == View.VISIBLE){ 
        holder.hiddenTextView.setVisibility(View.GONE); 
       } 
       else{ 
        holder.hiddenTextView.setVisibility(View.VISIBLE); 
       } 
      } 
     }); 
    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return length; 
    } 
} 

そして、いくつかのスクリーンショット事前に

Nothing ExpandedClicked on first itemAnother also expanded??

おかげ

答えて

2

リサイクラービューの再利用項目である - それはに合うそれらの一定量を作成し、画面を開き、スクロールしながら再利用します。たとえば、30個のアイテムを表示する必要がある場合、recyclerViewは7個のアイテムを作成し、それらをスクロールしながら再利用します。また、項目1は項目8、項目15などとなります。テキストビューを特定のアイテムに表示すると、同じアイテムであるため、スクロールすると表示されたままになります。

解決策は、特定の位置で特定のTextViewの視認性に関する情報を追跡し、その位置にスクロールするときに適用することです。

だから、あなたは何をすべきか必要があります。

は、所定の位置に

private boolean[] shouldBeHidden; 

次の項目の可視性に関する情報を保持するブール配列を作成し、コンストラクタでそれを初期化:

length = myItems.size(); 

    String[] mStrings = new String[myItems.size()]; 
    String[] stadtStrings = new String[myItems.size()]; 
    shouldBeHidden = new boolean[length]; 
    for(int i=0;i<myItems.size();i++) { 
     mStrings[i] = myItems.get(i).getkfz(); 
     stadtStrings[i] = myItems.get(i).getStadt(); 
     shouldBeHidden[i] = true; 
    } 

最終的に、OnBindViewHolderメソッドで可視性を設定します。

 holder.kennzeichen.setText(kennzeichen_array[position]); 
     holder.hiddenTextView.setText(stadt_array[position]); 
     final TextView myHiddenText = holder.hiddenTextView; 

     if (shouldBeHidden[position]){ 
      myHiddenText.setVisibility(View.GONE); 
     } 
     else{ 
      myHiddenText.setVisibility(View.VISIBLE); 
     } 

    holder.itemView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("Clicked", String.valueOf(holder.getAdapterPosition())); 
     if (myHiddenText.getVisibility()==View.VISIBLE){ 
      myHiddenText.setVisibility(View.GONE); 
      shouldBeHidden[position] = true; 
     } 
     else{ 
      myHiddenText.setVisibility(View.VISIBLE); 
      shouldBeHidden[position] = false; 
     } 

    } 
}); 
+0

Genius mate、迅速かつ有益な答えに感謝します!そのようにすることについても考えなかった。まっすぐに見える。 – T1M

関連する問題