gpt4 book ai didi

android - 重复使用膨胀的 View ,不膨胀超过一次

转载 作者:行者123 更新时间:2023-12-05 07:47:47 24 4
gpt4 key购买 nike

我想像 listView 适配器使用 convertView 一样重用膨胀 View 。我一直潜伏在适配器的源代码中,但运气不佳。

我需要根据数据将动态 View 添加到 recyclerItemView,现在我会根据需要的 View 进行多次充气,但考虑到它在 recyclerView 内部,根据数据量和滚动,此操作可能会变得非常昂贵用户的行为。

我的问题的其他解决方案是在 recyclerItem 中创建一个 ListView ,这样 ListView 就不会滚动,根据动态添加的数据扩展到最大高度(使 ListView 容器扩展以显示其所有数据)并使recyclerItem 根据其高度展开。

Activity

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

现在我正在循环内膨胀。我如何修改 View 参数以使其可重用于框架?

我的应用程序在 addView() 上崩溃 -->java.lang.IllegalStateException: 指定的 child 已经有一个 parent 。您必须先对 child 的 parent 调用 removeView()。

最佳答案

您提到的问题是通过创建 RecyclerView 解决的,它是对 ListView 的升级。 RecyclerView 所做的是它会创建/扩充 5-10 个列表项,当用户开始滚动新的 listItem View 时,实际上并没有扩充 listItem 中的数据。

这是一个很好的解释视频,说明了回收器 View 实际上如何与一些代码一起工作。 https://www.youtube.com/watch?v=Wq2o4EbM74k

我希望这能消除您对通货膨胀问题的疑虑。

关于android - 重复使用膨胀的 View ,不膨胀超过一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39252438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com