- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
E/Item Pos: 29
E/Item Rv: 15
E/Child Adapter: 30
public class MainActivity extends Activity {
RecyclerView reView;
ArrayList<RvModel> rvModels;
revAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
reView = (RecyclerView) findViewById(R.id.reView);
reView.setLayoutManager(new GridLayoutManager(MainActivity.this, 3));
rvModels = new ArrayList<>();
adapter = new revAdapter(MainActivity.this, rvModels);
reView.setAdapter(adapter);
prepareData();
reView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, reView, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.e("Item Pos", "" + position);
Log.e("Item Rv", "" + reView.getChildCount());
Log.e("Child Adapter", "" + reView.getAdapter().getItemCount());
for (int i = 0; i < reView.getChildCount(); i++) {
View v = reView.getChildAt(i);
TextView txtText = (TextView) v.findViewById(R.id.txtText);
txtText.setBackgroundColor(Color.WHITE);
txtText.setTextColor(Color.BLUE);
}
TextView txtText = (TextView) view.findViewById(R.id.txtText);
txtText.setBackgroundColor(Color.BLUE);
txtText.setTextColor(Color.WHITE);
}
@Override
public void onLongItemClick(View view, int position) {
}
}));
}
private void prepareData() {
rvModels.clear();
for (int i = 0; i < 30; i++) {
RvModel rvModel = new RvModel();
rvModel.setTitle("Item : " + i);
rvModels.add(rvModel);
}
adapter.notifyDataSetChanged();
}
}
public class revAdapter extends RecyclerView.Adapter<revAdapter.ViewHolder> {
Context context;
ArrayList<RvModel> rvModels;
LayoutInflater inflater;
public revAdapter(Context context, ArrayList<RvModel> rvModels) {
this.context = context;
this.rvModels = rvModels;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView ivIcon;
TextView txtText;
public ViewHolder(View itemView) {
super(itemView);
ivIcon = (ImageView) itemView.findViewById(R.id.ivIcon);
txtText = (TextView) itemView.findViewById(R.id.txtText);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = inflater.inflate(R.layout.rv_raw, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
RvModel rvModel = rvModels.get(position);
holder.txtText.setText(rvModel.getTitle());
}
@Override
public int getItemCount() {
return rvModels.size();
}
@Override
public int getItemViewType(int position) {
return position;
}
}
<?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:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<ImageView
android:id="@+id/ivIcon"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/txtText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
最佳答案
问题是像 ListView 这样的 recyclerView 有多少 subview (项目)取决于你的屏幕尺寸,而不是你有多少项目。它可以防止应用程序出现 OOM 异常。例如,如果您有 100 万个项目,那么根据您的逻辑,回收者 View 必须创建 100 万个 subview ,这很糟糕。您可以阅读有关 ListView 的更多信息 here (回收者 View 以相同的方式工作)
所以在您的情况下,在 onClick
事件中,您不需要找到 View 并更改它。您需要更改一些所谓的“设置”并编写 notifyDataSetChanged
或 notifyItemChanged
以获得更多优化。
此外,我已经检查了您的代码,我求求您了。请,请删除这个重写函数:
@Override
public int getItemViewType(int position) {
return position;
}
您对所有元素使用相同的支架,因此在您的回收站 View 中只有一种类型的 View 。以这种方式重写此方法,您告诉回收者 View ,每个项目都使用不同的布局,这会降低性能。
所以,根据你的问题,你会有某种:
reView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, reView, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.e("Item Pos", "" + position);
Log.e("Item Rv", "" + reView.getChildCount());
Log.e("Child Adapter", "" + reView.getAdapter().getItemCount());
if (!adapter.isChecked(position)) {
adapter.setChecked(position);
}
}
@Override
public void onLongItemClick(View view, int position) {
}
}));
在适配器中:
private int checkedPosition = -1;
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
RvModel rvModel = rvModels.get(position);
holder.txtText.setText(rvModel.getTitle());
if (position == checkedPosition) {
txtText.setBackgroundColor(Color.BLUE);
txtText.setTextColor(Color.WHITE);
} else {
txtText.setBackgroundColor(Color.WHITE);
txtText.setTextColor(Color.BLUE);
}
}
public boolean isChecked(int position) {
return checkedPosition == position;
}
public void setChecked(int position) {
int prevChecked = checkedPosition;
checkedPosition = position;
if (prevChecked != -1) {
notifyItemChanged(prevChecked);
}
notifyItemChanged(checkedPosition)
}
关于android - RecyclerView getChildAt(position) 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38474645/
我对 Android 中的 Gridview 有疑问。 上下文:我有一个 gridview,其中包含下载的图像列表(大约 100 张图像)。 为了更方便用户,加载第一个 gridview,里面有 10
我的代码 public class Products extends AppCompatActivity { protected void onCreate(Bundle savedInsta
我在 onCreateView 的 fragment 中设置了一个 gridview 来显示星期几,如下所示: weekGridView = (GridView)view.findViewById(R
这个问题在这里已经有了答案: Get all child views inside LinearLayout at once (6 个答案) 关闭 5 年前。 LinearLayout getChi
本文整理了Java中android.widget.ZoomControls.getChildAt()方法的一些代码示例,展示了ZoomControls.getChildAt()的具体用法。这些代码示例
我有一个带有全屏图片的 ListView 。 (就像一个垂直的画廊)。我的问题是我想重写 listviews onTouchEvent 以便它一次只更改一张图片,这样在滚动后(当没有发生滑动时),所选
嗨,我有一个可扩展的 ListView ,当我增加扩展它时它会滚动。然后我尝试检索所有的 child ,但它给了我当前在屏幕上的 child 。我怎样才能得到不在屏幕上的 child 。 http:/
我实际上尝试了一些非常简单的事情,但是 android 和 java 让我的生活变得不那么容易。这个想法是滚动到表格布局中的指定子项。 我正在使用 Layoutinflater 将条目添加到表格布局中
我想将图像添加到 ExpandableList 中的某些单元格中我已经搜索了我的问题的答案并尝试放置 expListView.getLastVisiblePosition(); expListView
我正在尝试从 GridView 获取 View 。不幸的是,它返回 null。 onCreate(): GridView gridview = (GridView) findViewById(R.id
我一直在做一个 android 项目,但遇到了一个问题。我用谷歌搜索但没有找到答案。在我的项目中,有一个名为 viewsurahfragment 的 fragment ,它包含一个 id 为 lv_s
获取层次结构中的 View 我可以使用这两个函数。同时findViewById更易于使用,但我经常看到有人建议它可能是一项昂贵的操作,应尽可能避免。 因此,使用 getChildAt 会更快吗?反而?
我有一个包含大量元素的 ListView ,我已将中间元素设置在屏幕中间(mRootLayoutHeight 是屏幕的高度) listview.setSelectionFromTop(adapter
我有一个从自定义相机 Activity 中拍摄的图像网格。在其他 Activity 中,我将图像加载到网格中。我有一种方法可以打开和关闭每个图像上的复选框。在尝试浏览所有图像时,我遇到了一些奇怪的行为
我在 ExpandableListView 中使用 GridView 我有一个功能可以在点击时突出显示一个项目,现在我正在尝试实现一个按钮,当按下它时它将取消选择所有选定的项目,但它只取消选择最后一次
我从ArrayList(listaprac)填充Spinner(SpinnerPrac)。 Spinner 工作正常,但我想为最后一个元素setTextColor。 这是我的适配器 ArrayAda
我在我的一个 fragment 中使用了 Spinner。当我从 backstack 转到这个 fragment (使用后退按钮)时,它给了我一个 NullPointerException。 代码如下
我有一个带有自定义适配器的 ListView,我需要访问此 ListView 的各个行的 View 。我正在尝试使用 getChildAt() 执行此操作,但它返回 null。 这是我的 ListVi
我在我的应用程序中实现了 Recyclerview,我需要在其项目上单击更新另一个 ListView ,这就是我在 Activity 中实现 onClick 事件的原因。它工作正常。 但我还需要高亮
我正在尝试在 Gallery View 上创建预览效果,但遇到了 Gallery.getChildAt(int position) 的问题,它大部分时间都返回 null。它应该仅在未显示子项时返回 n
我是一名优秀的程序员,十分优秀!