1

データベースからデータを取得して cardView に入力するコードをいくつか作成しました。cardView 行には、カードがクリックされたときに有効にしてビューを展開したい非表示の (なくなった) textView があります。これはすべて正常に機能しているようですが、何らかの理由でアイテム1だけでなく、明らかに望まない別のアイテムも展開し、展開する理由がわかりません。

これが私のアダプターです

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

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

何も展開されていません最初の項目をクリックしましたもう一つも拡大??

前もって感謝します

4

1 に答える 1

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

    }
});
于 2016-10-01T15:42:14.320 に答える