java - Recyclerview 扩展多个项目

标签 java android android-recyclerview android-cardview cardview

我创建了一些代码,从数据库中提取数据,然后填充到 cardView 中。 cardView 行有一个隐藏的(消失的)textView,我想在单击卡片时启用它,从而展开 View 。 所有这一切似乎工作正常,但出于某种原因,它不仅扩展了第 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;
    }
}

还有一些截图

Nothing Expanded Clicked on first item Another also expanded??

提前致谢

最佳答案

Recycler View 重用项目 - 它创建适合屏幕的固定数量的项目,并在您滚动时重用它们。因此,例如,如果您必须显示 30 个项目,recyclerView 将只创建 7 个项目,并在您滚动时重复使用它们。因此,第 1 项也将是第 8 项、第 15 项,依此类推。当您使 TextView 在特定项目上可见时,它在您滚动时保持可见,因为它是同一个项目。

解决方案是在给定位置跟踪有关特定 TextView 可见性的信息,并在您滚动到该位置时应用它。

那么,你需要做什么:

创建一个 boolean 数组,该数组将保存有关给定位置的项目可见性的信息

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

    }
});

关于java - Recyclerview 扩展多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807569/

相关文章:

android - 无法在 android 中实现 GoogleApiClient.ServerAuthCodeCallbacks

Android 为什么偏好会自动更改位置?

android - 在回收者 View 中显示广告

java - 对无限制的 Java 驻留集大小 (RSS) 增长进行故障排除

c# - 使用证书公钥验证 java 中的签名

java - 如何以编程方式从设置中获取启用的自定义键盘名称

java - 求数组中奇数的总和

android - 如何在双手机中从指定的 SIM 卡发送短信

android - 想要在单击回收器 View 时实现声音或媒体播放器

java - 在适配器中分配接口(interface)监听器的正确位置在哪里?