Recycleer View - 특정 위치에서 보기
에 대한 액티비티가 있습니다.RecyclerView ★★★ImageView는 지금 ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ다를 요.RecyclerView이미지 목록을 수평으로 표시합니다.「 」의 하면,RecyclerViewImageView이미지를 더 크게 보여줘야 합니다.을 사용법
, 이제 두 개 더 요.ImageButtons:imageButton_left ★★★★★★★★★★★★★★★★★」imageButton_rightimageButton_left의, " " "ImageView하고, 「」의 섬네일, 「」,」의 섬네일이 됩니다.RecyclerView이 변경을 반영해야 합니다. 경우도 입니다.imageButton_right.
할 수 요.ImageView단, 썸네일을 어떻게 회전시킬 수 있을까요?RecyclerView 구할 수 ViewHolder의 »ImageView무슨 일입니까?
코드:
액티비티 XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="vertical">
<ImageView
android:id="@+id/original_image"
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="fitXY"
android:src="@drawable/image_not_available_2" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:orientation="horizontal">
<ImageButton
android:id="@+id/imageButton_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:background="@drawable/rotate_left_icon" />
<ImageButton
android:id="@+id/imageButton_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android: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, android.support.v7.widget.LinearLayoutManager.HORIZONTAL, false);
mLayoutManager.setOrientation(android.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);
}
}
My Custom Adapter for RecycleerView:
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());
}
}
}
이게 네가 찾고 있는 거야.
저도 이런 문제가 있었어요.그리고 너처럼, 답을 찾기가 매우 어려워.하지만 View를 쉽게 얻을 수 있는 방법이 있습니다.특정 위치에서 홀더(어댑터에서 많이 할 수 있는 작업)
myRecyclerView.findViewHolderForAdapterPosition(pos);
메모: 뷰가 재활용된 경우 이 뷰는 반환됩니다.null마이클이 빨리 이 누락에 대해 알아줘서 고마워. 스크롤 하고 는, 이 에도, 할 수 .홀더로 인해 여러 가지 문제가 발생하고 있습니다.따라서 이 기술을 사용할 때는 특히 보기 모양 변경과 같은 비교적 느린 작업을 수행할 때 주의하십시오.
목록을 표시하기 위해 a를 사용하고 있을 것입니다.라고 하는 좋은 방법이 있다.
지정된 어댑터 위치를 나타내는 뷰를 찾습니다.
당신이 원하는 아이템의 어댑터 위치만 있으면 됩니다.
편집: Paul Weitascheck가 코멘트에서 언급한 바와 같이findViewByPosition입니다.LayoutManager 모든 Layout 매니저(레이아웃 매니저(레이아웃 매니저))에서합니다.StaggeredGridLayoutManager의 개요)
「 」를 View 해 주세요.itemView[ the ](의 속성myRecyclerView.findViewHolderForAdapterPosition(pos).itemView;
둘 다 사용할 수 있습니다.
recyclerViewInstance.findViewHolderForAdapterPosition(adapterPosition) ★★★★★★★★★★★★★★★★★」recyclerViewInstance.findViewHolderForLayoutPosition(layoutPosition)에서 두 유형의 RecycleerView 。
어댑터 위치:어댑터 내 항목 위치입니다.이것이 어댑터의 관점입니다.
레이아웃 위치:최신 레이아웃 계산에서 항목의 위치입니다.이것이 Layout Manager의 관점입니다.를 사용해 주세요.getAdapterPosition()위해서findViewHolderForAdapterPosition(adapterPosition)그리고.getLayoutPosition()위해서findViewHolderForLayoutPosition(layoutPosition).
recyclerview 어댑터 및 기타 멤버 변수에서 이전에 선택한 항목 위치를 유지할 멤버 변수를 사용하여 사용자가 처음 클릭하는지 확인합니다.
자세한 내용은 아래쪽에 샘플 코드와 스크린샷이 첨부되어 있습니다.
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerList = null;
private RecyclerAdapter adapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerList = (RecyclerView) findViewById(R.id.recyclerList);
}
@Override
protected void onStart() {
RecyclerView.LayoutManager layoutManager = null;
String[] daysArray = new String[15];
String[] datesArray = new String[15];
super.onStart();
for (int i = 0; i < daysArray.length; i++){
daysArray[i] = "Sunday";
datesArray[i] = "12 Feb 2017";
}
adapter = new RecyclerAdapter(mRecyclerList, daysArray, datesArray);
layoutManager = new LinearLayoutManager(MainActivity.this);
mRecyclerList.setAdapter(adapter);
mRecyclerList.setLayoutManager(layoutManager);
}
}
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyCardViewHolder>{
private final String TAG = "RecyclerAdapter";
private Context mContext = null;
private TextView mDaysTxt = null, mDateTxt = null;
private LinearLayout mDateContainerLayout = null;
private String[] daysArray = null, datesArray = null;
private RecyclerView mRecyclerList = null;
private int previousPosition = 0;
private boolean flagFirstItemSelected = false;
public RecyclerAdapter(RecyclerView mRecyclerList, String[] daysArray, String[] datesArray){
this.mRecyclerList = mRecyclerList;
this.daysArray = daysArray;
this.datesArray = datesArray;
}
@Override
public MyCardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = null;
View view = null;
MyCardViewHolder cardViewHolder = null;
mContext = parent.getContext();
layoutInflater = LayoutInflater.from(mContext);
view = layoutInflater.inflate(R.layout.date_card_row, parent, false);
cardViewHolder = new MyCardViewHolder(view);
return cardViewHolder;
}
@Override
public void onBindViewHolder(MyCardViewHolder holder, final int position) {
mDaysTxt = holder.mDaysTxt;
mDateTxt = holder.mDateTxt;
mDateContainerLayout = holder.mDateContainerLayout;
mDaysTxt.setText(daysArray[position]);
mDateTxt.setText(datesArray[position]);
if (!flagFirstItemSelected){
mDateContainerLayout.setBackgroundColor(Color.GREEN);
flagFirstItemSelected = true;
}else {
mDateContainerLayout.setBackground(null);
}
}
@Override
public int getItemCount() {
return daysArray.length;
}
class MyCardViewHolder extends RecyclerView.ViewHolder{
TextView mDaysTxt = null, mDateTxt = null;
LinearLayout mDateContainerLayout = null;
LinearLayout linearLayout = null;
View view = null;
MyCardViewHolder myCardViewHolder = null;
public MyCardViewHolder(View itemView) {
super(itemView);
mDaysTxt = (TextView) itemView.findViewById(R.id.daysTxt);
mDateTxt = (TextView) itemView.findViewById(R.id.dateTxt);
mDateContainerLayout = (LinearLayout) itemView.findViewById(R.id.dateContainerLayout);
mDateContainerLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LinearLayout linearLayout = null;
View view = null;
if (getAdapterPosition() == previousPosition){
view = mRecyclerList.findViewHolderForAdapterPosition(previousPosition).itemView;
linearLayout = (LinearLayout) view.findViewById(R.id.dateContainerLayout);
linearLayout.setBackgroundColor(Color.GREEN);
previousPosition = getAdapterPosition();
}else {
view = mRecyclerList.findViewHolderForAdapterPosition(previousPosition).itemView;
linearLayout = (LinearLayout) view.findViewById(R.id.dateContainerLayout);
linearLayout.setBackground(null);
view = mRecyclerList.findViewHolderForAdapterPosition(getAdapterPosition()).itemView;
linearLayout = (LinearLayout) view.findViewById(R.id.dateContainerLayout);
linearLayout.setBackgroundColor(Color.GREEN);
previousPosition = getAdapterPosition();
}
}
});
}
}
'검색 보기'를 사용하면 됩니다.HolderForAdapterPosition" 메서드 리사이클러 뷰에서 뷰를 얻을 수 있습니다.그 후 홀더 오브젝트를 어댑터 뷰홀더에 타이프캐스트하여 뷰홀더의 뷰에 직접 액세스할 수 있도록 합니다.
다음은 kotlin의 샘플코드입니다.
val viewHolder = recyclerView.findViewHolderForAdapterPosition(position)
val textview=(viewHolder as YourViewHolder).yourTextView
Array List of View를 만들 수 있습니다.홀더:
ArrayList<MyViewHolder> myViewHolders = new ArrayList<>();
ArrayList<MyViewHolder> myViewHolders2 = new ArrayList<>();
및 모든 스토어 뷰다음과 같은 목록의 보유자:
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
final String str = arrayList.get(position);
myViewHolders.add(position,holder);
}
기타 보기 추가/제거고객의 요건에 따라 Array List의 보유자.
특정 위치에서 보기를 가져오려면FindView를 호출해야 합니다.RecycleerView를 반환하는 recycleView오브젝트의 HolderForAdapterPosition(위치).뷰 홀더
RecycleerView를 참조해 주세요.아이템이 있는 ViewHolder 객체View는 특정 위치에 있는 모든 뷰에 액세스할 수 있습니다.
RecyclerView.ViewHolder rv_view = recyclerView.findViewHolderForAdapterPosition(position);
ImageView iv_wish = rv_view.itemView.findViewById(R.id.iv_item);
다음을 사용하여 재활용 보기에서 특정 위치에 대한 보기를 얻을 수 있습니다.
int position = 2;
RecyclerView.ViewHolder viewHolder = recyclerview.findViewHolderForItemId(position);
View view = viewHolder.itemView;
ImageView imageView = (ImageView)view.findViewById(R.id.imageView);
어댑터가 목록에 추가될 때까지 기다려야 합니다. 그러면 위치별로 보기를 시도할 수 있습니다.
final int i = 0;
recyclerView.setAdapter(adapter);
recyclerView.post(new Runnable() {
@Override
public void run() {
View view = recyclerView.getLayoutManager().findViewByPosition(i);
}
});
재사용자 보기 목록에서 특정 보기를 가져오거나 재사용자 보기의 편집 텍스트에 오류가 표시됩니다.
private void popupErrorMessageAtPosition(int itemPosition) {
RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(itemPosition);
View view = viewHolder.itemView;
EditText etDesc = (EditText) view.findViewById(R.id.et_description);
etDesc.setError("Error message here !");
}
이렇게 할 수도 있습니다. 재사용 보기 위치 항목을 클릭한 후 보기를 수정하려는 경우 유용합니다.
@Override
public void onClick(View view, int position) {
View v = rv_notifications.getChildViewHolder(view).itemView;
TextView content = v.findViewById(R.id.tv_content);
content.setText("Helloo");
}
아래를 사용할 수 있습니다.
mRecyclerview.getChildAt(pos);
RecycleerView - 특정 위치에서 보기를 가져옵니다. //int는 = 위치입니다.이 암호는 나에게 효과가 있었다.
@Override
public void onBindViewHolder(@NonNull @org.jetbrains.annotations.NotNull QuizAdapter.MyViewHolder holder, int position) {
final QuizModel tmodel = modellist.get(position);
holder.tv_question.setText(tmodel.getQuestion());
holder.tv_option_One.setText(tmodel.getOptionA());
holder.tv_option_two.setText(tmodel.getOptionB());
holder.tv_option_three.setText(tmodel.getOptionC());
holder.tv_option_four.setText(tmodel.getOptionD());
holder.tv_option_five.setText(tmodel.getOptionE());
holder.ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int is = position;
Toast.makeText(v.getContext(), "count" + is, Toast.LENGTH_LONG).show();
Intent i = new Intent(context, DetailsQuizActivity.class);
i.putExtra("question", tmodel.getQuestion());
i.putExtra("option_a", tmodel.getOptionA());
i.putExtra("option_b", tmodel.getOptionB());
i.putExtra("option_c", tmodel.getOptionC());
i.putExtra("option_d", tmodel.getOptionD());
i.putExtra("option_e", tmodel.getOptionE());
i.putExtra("answer", tmodel.getOptionAnswer());
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
});
임의의 int 위치에 있는 뷰를 취득하려고 할 때마다 null이 되는 경우는 다음과 같이 새로운 컨스트럭터 파라미터를 어댑터에 추가합니다.
class RecyclerViewTableroAdapter(
private val fichas: Array<MFicha?>,
private val activity: View.OnClickListener,
private val indicesGanadores:MutableList<Int>
) : RecyclerView.Adapter<RecyclerViewTableroAdapter.ViewHolder>() {
//CODE
}
게임에서 이긴 경우 카드뷰 배경을 색칠하기 위해 indexGanadores를 추가했습니다.
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
//CODE
if(indicesGanadores.contains(position)){
holder.cardViewFicha.setCardBackgroundColor((activity as MainActivity).resources.getColor(R.color.DarkGreen))
}
//MORE CODE
}
아직 배경을 색칠할 필요가 없는 경우 다음과 같이 빈 가변 목록을 보냅니다.
binding.recyclerViewMain.adapter = RecyclerViewTableroAdapter(fichasTablero, this@MainActivity, mutableListOf<Int>())
해피 코딩!...
recyclerView.post(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
View viewTemp = recyclerView.getLayoutManager().findViewByPosition(i);
CardView cardView = (CardView) viewTemp.findViewById(R.id.cardView);
//TO DO
}
}
});
언급URL : https://stackoverflow.com/questions/33784369/recyclerview-get-view-at-particular-position
'programing' 카테고리의 다른 글
| 부팅에 실패했습니다.이진수를 찾을 수 없습니다.이클립스 헬리오스의 CDT (0) | 2022.07.29 |
|---|---|
| JAX-WS를 사용한 XML 요구/응답 추적 (0) | 2022.07.29 |
| 기능을 속성으로 Vue 구성 요소에 전달 (0) | 2022.07.29 |
| Eclipse - Java (JRE) / (JDK) ... 가상 머신 없음 (0) | 2022.07.29 |
| 모듈을 찾을 수 없음: 오류:'/myapp/src/store'에서 'vuex'를 확인할 수 없습니다. (0) | 2022.07.29 |


