- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试使用新的 RecyclerView小部件几天了,我认为我已经设法创建了水平和网格布局,并且还克服了它缺乏实现 OnClickListener 的直接方法的事实(我为此使用了 GreenRobot's EventBus),我仍然很难选择一件元素并在整个回收过程中保持该状态(风格)。
这是我用于我的适配器的代码
public class ArticuloItemAdapter extends RecyclerView.Adapter<ArticuloItemAdapter.ItemHolder> {
private ArrayList<ArticuloObject> mItems;
private LayoutInflater mLayoutInflater;
private int mSize;
private int mSelectedPosition;
private RecyclerView mRecyclerView;
public ArticuloItemAdapter(Context context, RecyclerView rv, ArrayList<ArticuloObject> articulos) {
mLayoutInflater = LayoutInflater.from(context);
mItems=articulos ;
mSize = context.getResources()
.getDimensionPixelSize(R.dimen.icon);
mSelectedPosition = -1;
mRecyclerView = rv;
}
@Override
public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = mLayoutInflater.inflate(R.layout.gallery_recycler_row, parent, false);
return new ItemHolder(itemView, this);
}
@Override
public void onBindViewHolder(ItemHolder holder, int position) {
Ion.with(holder.getPicImageView())
.placeholder(R.drawable.owner_placeholder)
.resize(mSize, mSize)
.centerCrop()
.error(R.drawable.owner_error)
.load(mItems.get(position).getUrl());
//Update the views as they got recycled
if (mSelectedPosition != position) {
holder.getPicImageView().setBackgroundColor(Color.TRANSPARENT);
} else {
holder.getPicImageView().setBackgroundColor(Color.CYAN);
}
}
@Override
public int getItemCount() {
return mItems.size();
}
public int getSelectedPosition() {
return mSelectedPosition;
}
public void setSelectedPosition(int mSelectedPosition) {
this.mSelectedPosition = mSelectedPosition;
}
public RecyclerView getRecyclerView() {
return mRecyclerView;
}
/* Required implementation of ViewHolder to wrap item view */
public class ItemHolder extends RecyclerView.ViewHolder implements
View.OnClickListener {
private ArticuloItemAdapter mParent;
private ImageView mPicImageView;
public ItemHolder(View itemView, ArticuloItemAdapter parent) {
super(itemView);
itemView.setOnClickListener(this);
mParent = parent;
mPicImageView = (ImageView) itemView.findViewById(R.id.picture_image_view);
}
public ImageView getPicImageView() {
return mPicImageView;
}
@Override
public void onClick(View v) {
EventBus.getDefault().post(new OnArticuloCartaClickEvent(this, getPosition()));
setItemActivated(v);
}
public void setItemActivated(View v) {
//Check position of previous selected item. The first time an item is selected, the previous position will be -1
if (mParent.getSelectedPosition() >= 0) {
ItemHolder row = (ItemHolder) mParent.getRecyclerView().findViewHolderForPosition(mParent.getSelectedPosition());
if (row != null) {
row.getPicImageView().setBackgroundColor(Color.TRANSPARENT);
}
}
mParent.setSelectedPosition(getPosition());
v.findViewById(R.id.picture_image_view).setBackgroundColor(Color.CYAN);
}
}
}
现在在上面显示的代码中,我为跟踪所选项目所做的一切如下:
我。在 onClick(View v) 事件中:
setItemActivated
方法ViewHolder
,如果该 View 不为空,我将 ImageView
的背景颜色更改回它是原始背景颜色(透明)getPosition()
ViewHolder
中的 ImageView
的背景颜色更改为不同的颜色(在本例中为青色)二。在 onBindViewHolder(ItemHolder holder, int position) 方法中:
如果所选项目的位置 (mSelectedPosition) 不同于正在显示的 View 的位置,我更改背景ImageView
的颜色恢复为默认颜色。否则,我将 ImageView
的颜色更改为用于标识所选项目的颜色 (CYAN)。
只要 RecyclerView 有相当多的项目需要开始回收 View ,所有这一切都有效。但如果没有,就像我的情况一样,我注意到 findViewHolderForPosition
总是返回 null,因此,我无法将先前选择的项目的颜色更改回其默认颜色并且所以我最终选择了不止一项。
更糟糕的是,由于 RecyclerView
不需要回收任何东西,onBindViewHolder
方法永远不会被调用,因此我不能指望代码里面相应地调整项目的颜色。
拜托,如果有人能告诉我我在这里做错了什么或者提供一些想法,我将不胜感激。不能做像选择项目这样基本的事情真的很令人沮丧。
提前致谢。
最佳答案
发生这种情况是因为当所选项目发生变化时,您并没有告诉 RecyclerView 之前的项目已失效。
与其尝试手动设置,不如执行以下操作:
public void setItemActivated(View v) {
final int myPos = getAdapterPosition();
if (myPos == RecyclerView.NO_POSITION) {
// very rare case where item is clicked but its adapter position
// is unknown. ignore the event.
// See docs of getAdapterPosition for details
}
final int prevSelected = mParent.getSelectedPosition();
mParent.setSelectedPosition(myPos);
if (prevSelected >= 0 && prevSelected < mParent.getItemCount()) {
mParent.notifyItemChanged(prevSelected);
}
mParent.notifyItemChanged(myPos);
}
RecyclerView 将为应该更新的 View 调用 onBind。你不需要关心之前选择的项目在哪里。
关于android - RecyclerView - 未调用 onBindViewHolder 时,findViewHolderForPosition 始终返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29458808/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!