java RecyclerView在特定位置获取视图
我有一个带有RecyclerView
和ImageView
的活动。我使用RecyclerView
水平显示图像列表。当我点击RecyclerView
中的图像时,活动中的ImageView
应该会显示图像的更大图片。到目前为止一切正常
现在活动中还有两个ImageButtons
:imageButton_left
和imageButton_right
。当我点击imageButton_left
时,ImageView
中的图像应该向左,而且RecyclerView
中的缩略图应该反映这种变化。与之类似的是imageButton_right
我可以旋转ImageView
。但是,如何在^{ViewHolder
的ImageView
代码:
活动XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
xmlns:app="http://schemas.安卓.com/apk/res-auto"
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
安卓:orientation="vertical">
<安卓.support.v7.widget.RecyclerView
安卓:id="@+id/recyclerview"
安卓:layout_width="match_parent"
安卓:layout_height="wrap_content"
安卓:layout_margin="10dp" />
<LinearLayout
安卓:layout_width="match_parent"
安卓:layout_height="wrap_content"
安卓:layout_margin="10dp"
安卓:orientation="vertical">
<ImageView
安卓:id="@+id/original_image"
安卓:layout_width="200dp"
安卓:layout_height="200dp"
安卓:scaleType="fitXY"
安卓:src="@drawable/image_not_available_2" />
<LinearLayout
安卓:layout_width="match_parent"
安卓:layout_height="wrap_content"
安卓:layout_marginTop="10dp"
安卓:gravity="center_horizontal"
安卓:orientation="horizontal">
<ImageButton
安卓:id="@+id/imageButton_left"
安卓:layout_width="wrap_content"
安卓:layout_height="wrap_content"
安卓:layout_marginRight="20dp"
安卓:background="@drawable/rotate_left_icon" />
<ImageButton
安卓:id="@+id/imageButton_right"
安卓:layout_width="wrap_content"
安卓:layout_height="wrap_content"
安卓:background="@drawable/rotate_right_icon" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
我的活动代码:
public class SecondActivity extends AppCompatActivity implements IRecyclerViewClickListener {
RecyclerView mRecyclerView;
LinearLayoutManager mLayoutManager;
RecyclerViewAdapter mRecyclerViewAdapter;
List<String> urls = new ArrayList<String>();
ImageView mOriginalImageView;
ImageButton mLeftRotate, mRightRotate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
urls.clear();
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mLayoutManager = new LinearLayoutManager(this, 安卓.support.v7.widget.LinearLayoutManager.HORIZONTAL, false);
mLayoutManager.setOrientation(安卓.support.v7.widget.LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerViewAdapter = new RecyclerViewAdapter(this, urls);
mRecyclerView.setAdapter(mRecyclerViewAdapter);
mOriginalImageView = (ImageView) findViewById(R.id.original_image);
mLeftRotate = (ImageButton) findViewById(R.id.imageButton_left);
mLeftRotate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOriginalImageView.setRotation(mOriginalImageView.getRotation() - 90);
}
});
mRightRotate = (ImageButton) findViewById(R.id.imageButton_right);
mRightRotate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOriginalImageView.setRotation(mOriginalImageView.getRotation() + 90);
}
});
Intent intent = getIntent();
if (intent != null) {
String portfolio = intent.getStringExtra("portfolio");
try {
JSONArray jsonArray = new JSONArray(portfolio);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String url = jsonObject.getString("url");
urls.add(url);
}
Log.d(Const.DEBUG, "URLs: " + urls.toString());
mRecyclerViewAdapter.notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onItemClick(int position) {
Picasso.with(this).load(urls.get(position)).into(mOriginalImageView);
}
}
我的RecyclerView自定义适配器:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
Context context;
List<String> mUrls = new ArrayList<String>();
IRecyclerViewClickListener mIRecyclerViewClickListener;
public int position;
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public RecyclerViewAdapter(Context context, List<String> urls) {
this.context = context;
this.mUrls.clear();
this.mUrls = urls;
Log.d(Const.DEBUG, "Urls Size: " + urls.size());
Log.d(Const.DEBUG, urls.toString());
if (context instanceof IRecyclerViewClickListener)
mIRecyclerViewClickListener = (IRecyclerViewClickListener) context;
else
Log.d(Const.DEBUG, "Implement IRecyclerViewClickListener in Activity");
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_horizontal_recyclerview, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Picasso.with(context).load(mUrls.get(position)).into(holder.mImageView);
}
@Override
public int getItemCount() {
return mUrls.size();
}
public void rotateThumbnail() {
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ImageView mImageView;
public View v;
public ViewHolder(View v) {
super(v);
v.setTag(getAdapterPosition());
v.setOnClickListener(this);
this.mImageView = (ImageView) v.findViewById(R.id.image);
}
@Override
public void onClick(View v) {
this.v = v;
mIRecyclerViewClickListener.onItemClick(getAdapterPosition());
}
}
}
# 1 楼答案
我想你是在用^{} 来显示列表。它有一个叫做^{} 的好方法
你所需要的只是你感兴趣的物品的适配器位置
编辑:正如Paul Woitaschek在评论中指出的,
findViewByPosition
是一种LayoutManager
的方法,因此它适用于所有的布局经理(即StaggeredGridLayoutManager
等)# 2 楼答案
这就是你要找的
我也有这个问题。和你一样,答案很难找到。但是,有一种简单的方法可以从特定位置获取ViewHolder(在适配器中,您可能会做很多事情)
myRecyclerView.findViewHolderForAdapterPosition(pos);
注意:如果视图已被回收,则返回
null
。感谢Michael很快发现了我的重要遗漏# 3 楼答案
你可以两者兼用
recyclerViewInstance.findViewHolderForAdapterPosition(adapterPosition)
和recyclerViewInstance.findViewHolderForLayoutPosition(layoutPosition)
。 确保RecyclerView视图使用两种类型的位置适配器位置:项目在适配器中的位置。这是适配器的位置
布局位置:项目在最新布局计算中的位置。从布局经理的角度来看,这是一个职位。 你应该用
getAdapterPosition()
表示findViewHolderForAdapterPosition(adapterPosition)
,用getLayoutPosition()
表示findViewHolderForLayoutPosition(layoutPosition)
获取一个成员变量以保持之前在recyclerview适配器中选择的项目位置,并获取其他成员变量以检查用户是否首次单击
下面附有示例代码和屏幕截图,以了解更多信息
}
![fifth element selected and previously selected item becomes unselected](https://i.stack.imgur.com/JIT0p.png)