1

Я хочу повторно использовать раздутый вид так же, как адаптер 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() родителя ребенка.

+0

так что проблема с использованием RecyclerView? – lelloman

+0

Моя проблема в том, что я хочу раздуть сложный макет и добавить его в linearlayout с помощью addView(), поэтому, если элемент recycler должен раздуть 4-5 этого макета внутри линейногоLayout, ** это может замедлить или даже заморозить прокрутить список повторного использования **; потому что операция надувания будет выполняться втрое, поскольку элементы рециклирования заполняются и опущены, а _inflate его дорогостоящая операция, в которой список Widgets не позволяет повторить, если это возможно. Прямо сейчас я буду делать это 2-3 раза в строке для повторного использования. –

+0

да, раздувая взгляды, это дорогостоящая операция, поэтому они сделали ListView/RecyclerView так, чтобы он не раздувал взгляды каждый раз, но он будет повторно использовать их и просто привязывать данные – lelloman

ответ

0

Проблема, о которой вы говорите, - это тот, который был адресован при создании RecyclerView, который является обновлением до ListView. Что делает RecyclerView, так это то, что он будет создавать/накачивать, скажем, 5-10 элементов списка, и когда пользователь начинает прокрутку нового вида (списка) listItem, не раздувается, а только данные обновляются внутри listItem.

Это отличное объяснительное видео о том, как просмотр ресайклеров фактически работает с небольшим количеством кода. https://www.youtube.com/watch?v=Wq2o4EbM74k

Надеюсь, это избавит вас от сомнений относительно проблемы инфляции.

0

Мое приложение отключается при добавлении() -> java.lang.IllegalStateException: указанный дочерний элемент уже имеет родительский элемент. Сначала вы должны вызвать removeView() родителя ребенка.

попробовать:

@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); 

    for (int i = 0; i < 20; i++) { 
     View v = inflater.inflate(R.layout.item_list, holder.linearLayout, false); 
     TextView textView = (TextView) v.findViewById(R.id.textView); 
     textView.setText("hello" + i); 
     holder.linearLayout.addView(v); 
    } 
} 

itemSample.xml

<?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="wrap_content" 
      android:orientation="vertical"> 

<TextView 
    android:id="@+id/name" 
    android:layout_width="wrap_content" 
    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="200dp" 
    android:layout_marginLeft="30dp" 
    android:orientation="vertical" 
    android:isScrollContainer="true" 
    /> 

</LinearLayout> 

ITEMLIST.XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="40dp" 
    android:isScrollContainer="true" 
    android:id="@+id/txt_cont" 
    > 

<TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 
</LinearLayout> 

Just Raw Solution

You should try answer @

+0

Код, который я хочу, - это ** выполнение операции раздувания только один раз для всех просмотров **, если и прочитать комментарии по моему вопросу, вы увидите, производительность кода uve, размещенная здесь, может быть, спасибо за время ur, но это не то, что я ищу. (Действительно, мой код работает точно так же, как тот, который вы опубликовали, до тех пор, пока я не выйду: P) –

 Смежные вопросы

  • Нет связанных вопросов^_^