Я хочу повторно использовать раздутый вид так же, как адаптер listView делает с convertView. Я не скрывал исходный код адаптеров.Повторное использование раздутого вида, без раздувания более одного раза
Мне нужно добавить динамические представления в зависимости от данных в recyclerItemView, теперь im раздувая столько раз, сколько мне нужно, но имея в виду его внутри recyclerView, эта операция может стать абсурдно дорогостоящей в зависимости от объема данных и прокручивание поведения пользователя.
Другое решение моей проблемы состояло в том, чтобы создать список в recyclerItem, поэтому listview не будет прокручиваться, расширяется до максимальной высоты в зависимости от динамического добавления данных (чтобы контейнер списка отображался для отображения всех его данных) и recyclerItem расширяется в зависимости от его высоты.
АКТИВНОСТЬ
public class Main1Activity extends AppCompatActivity {
RecyclerView recyclerView;
CustomAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
recyclerView = (RecyclerView) findViewById(R.id.recycler);
setUpRecycler();
}
private void setUpRecycler(){
Sample sample1 = new Sample("List of Items1");
Sample sample2 = new Sample("List of Items2");
Sample sample3 = new Sample("List of Items3");
List<Sample> sampleList = new ArrayList<>();
sampleList.add(sample1);
sampleList.add(sample2);
sampleList.add(sample3);
adapter = new CustomAdapter(this,sampleList);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="30dp">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
МОДЕЛЬ
public class Sample {
String name;
public Sample(){}
public Sample(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
XML ПУНКТЫ
**item_list**
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
**item_smaple**
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_margin="10dp"
android:text="List of Items"
android:textSize="20sp"/>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:orientation="vertical"/>
</LinearLayout>
АДАПТЕР
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
private List<Sample> mySamples;
private Context mContext;
public CustomAdapter(Context context, List<Sample> mySamples) {
this.mContext = context;
this.mySamples = mySamples;
}
private Context getContext() {
return mContext;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView name;
public LinearLayout linearLayout;
public ViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
linearLayout = (LinearLayout) itemView.findViewById(R.id.linearLayout);
}
}
@Override
public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View contactView = inflater.inflate(R.layout.item_sample, parent, false);
ViewHolder viewHolder = new ViewHolder(contactView);
return viewHolder;
}
@Override
public void onBindViewHolder(CustomAdapter.ViewHolder holder, int position) {
Sample sample = mySamples.get(position);
holder.name.setText(sample.getName());
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.item_list, null, false);
for (int i = 0; i < 20; i++){
TextView textView = (TextView) v.findViewById(R.id.textView);
textView.setText("hello"+i);
holder.linearLayout.addView(v);
}
}
@Override
public int getItemCount() {
return mySamples.size();
}
}
Прямо сейчас i'm раздувания внутри цикла. Как я могу изменить параметры просмотра, чтобы сделать его повторно используемым для фреймворка?
Мое приложение разбивается на addView() -> java.lang.IllegalStateException: указанный ребенок уже имеет родителя. Сначала вы должны вызвать removeView() родителя ребенка.
так что проблема с использованием RecyclerView? – lelloman
Моя проблема в том, что я хочу раздуть сложный макет и добавить его в linearlayout с помощью addView(), поэтому, если элемент recycler должен раздуть 4-5 этого макета внутри линейногоLayout, ** это может замедлить или даже заморозить прокрутить список повторного использования **; потому что операция надувания будет выполняться втрое, поскольку элементы рециклирования заполняются и опущены, а _inflate его дорогостоящая операция, в которой список Widgets не позволяет повторить, если это возможно. Прямо сейчас я буду делать это 2-3 раза в строке для повторного использования. –
да, раздувая взгляды, это дорогостоящая операция, поэтому они сделали ListView/RecyclerView так, чтобы он не раздувал взгляды каждый раз, но он будет повторно использовать их и просто привязывать данные – lelloman