我创建了一些代码,该代码从数据库中提取数据,然后填充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;
}
}
还有一些截图
提前致谢
最佳答案
回收器视图重复使用项-它创建固定数量的适合屏幕的项目,并在滚动时重复使用。因此,例如,如果您必须显示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;
}
}
});
关于java - Recyclerview扩展多个项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39807569/