RecyclerView-получить представление в определенной позиции



у меня есть деятельность с RecyclerView и ImageView. Я использую RecyclerView для отображения списка изображений по горизонтали. Когда я нажимаю на изображение в тег RecyclerView the ImageView в действии должна отображаться большая картина изображения. Пока все работает нормально.



теперь есть еще два ImageButtons в работе: imageButton_left и imageButton_right. Когда я нажимаю на imageButton_left изображение в ImageView следует повернуть налево, а также, эскиз в RecyclerView должны отражать это изменение. Аналогично обстоит дело и с imageButton_right.



Я могу повернуть ImageView. Но, как я могу повернуть миниатюру в RecyclerView? Как я могу получить ViewHolder ' s 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);
}
}


мой пользовательский адаптер для 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());
}
}


}
740   6  

6 ответов:

Я полагаю, вы используете LinearLayoutManager Показать список. Он имеет хороший метод под названием findViewByPosition это

находит представление, которое представляет заданное положение адаптера.

все, что вам нужно, это положение адаптера элемента, который вас интересует.

edit: как отмечает Павел Войташек в комментариях findViewByPosition метод LayoutManager так это будет работать со всеми LayoutManagers (т. е. StaggeredGridLayoutManager и т. д.)

Это то, что вы ищете.

у меня тоже эта проблема. И, как и вы, ответ очень трудно найти. Но есть простой способ получить ViewHolder из определенной позиции (что-то вы, вероятно, будете делать много в адаптере).

myRecyclerView.findViewHolderForAdapterPosition(pos);

Примечание: если представление было переработано, это вернет null. Спасибо Майклу за то, что быстро уловил мое важное упущение.

Если вы хотите View, убедитесь, что доступ к itemView свойство ViewHolder вот так:myRecyclerView.findViewHolderForAdapterPosition(pos).itemView;

вы можете использовать как

recyclerViewInstance.findViewHolderForAdapterPosition(adapterPosition) и recyclerViewInstance.findViewHolderForLayoutPosition(layoutPosition). Убедитесь, что RecyclerView view использует два типа позиций

положение адаптера: положение элемента в адаптере. Это положение с точки зрения адаптера. Положение макета: положение элемента в последнем расчете макета. Это позиция с точки зрения LayoutManager. Вы должны использовать 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();    
                }    
            }    
        });    
    }    
}       

} first element selected second element selected and previously selected item becomes unselected fifth element selected and previously selected item becomes unselected

Вы можете сделать ArrayList из ViewHolder:

 ArrayList<MyViewHolder> myViewHolders = new ArrayList<>();
 ArrayList<MyViewHolder> myViewHolders2 = new ArrayList<>();

и, все храните ViewHolder(ы) в списке, как :

 @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
        final MonkeyKides monkeyKides = arrayList.get(position);

        myViewHolders.add(position,holder);
}

и добавить / удалить другой ViewHolder в ArrayList в соответствии с вашим требованием.

вы также можете сделать это, это поможет, когда вы хотите изменить представление после нажатия элемента позиции recyclerview

@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");

        }

Comments

    Ничего не найдено.