gpt4 book ai didi

java - RecyclerView 中的选择器问题

转载 作者:太空狗 更新时间:2023-10-29 13:53:22 25 4
gpt4 key购买 nike

我有我的可绘制选择器。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/selected" android:state_activated="true"/>
<item android:drawable="@drawable/selected" android:state_pressed="true"/>
<item android:drawable="@drawable/selected" android:state_checked="true"/>
<item android:drawable="@drawable/selected" android:state_focused="true"/>

<item android:drawable="@drawable/unselected"/>

这是我的 RecycleView 适配器

public class AdapterMain extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
List<String> data = Collections.emptyList();
DataMain current;
int currentPos = 0;
List<Integer> pos;
List<String> mDataset = data;
private SparseBooleanArray selectedItems;
private int focusedItem = 0;


// create constructor to innitilize context and data sent from MainActivity
public AdapterMain(Context context, List<String> data) {
this.context = context;

this.data = data;
}

@Override
public void onAttachedToRecyclerView(final RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);

// Handle key up and key down and attempt to move selection
recyclerView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
RecyclerView.LayoutManager lm = recyclerView.getLayoutManager();

// Return false if scrolled to the bounds and allow focus to move off the list
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
return tryMoveSelection(lm, 1);
} else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
return tryMoveSelection(lm, -1);
}
}

return false;
}
});
}

// Inflate the layout when viewholder created
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, final int viewType) {


LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.container_main, parent, false);
MyHolder holder = new MyHolder(view);

return holder;
}

private boolean tryMoveSelection(RecyclerView.LayoutManager lm, int direction) {
int tryFocusItem = focusedItem + direction;

// If still within valid bounds, move the selection, notify to redraw, and scroll
if (tryFocusItem >= 0 && tryFocusItem < getItemCount()) {
notifyItemChanged(focusedItem);
focusedItem = tryFocusItem;
notifyItemChanged(focusedItem);
lm.scrollToPosition(focusedItem);
return true;
}

return false;
}

// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//final String element = mDataset.get(position);

// Get current position of item in recyclerview to bind data and assign values from list
MyHolder myHolder = (MyHolder) holder;
String current = data.get(position);
myHolder.textTitle.setText(current);


//myHolder.textPrice.setTextColor(ContextCompat.getColor(context, R.color.colorAccent));

// load image into imageview using glide
// Glide.with(context).load("http://192.168.1.7/test/images/" +

current.fishImage)
// .placeholder(R.drawable.ic_img_error)
// .error(R.drawable.ic_img_error)
// .into(myHolder.ivFish);

}

// return total item from List
@Override
public int getItemCount() {
return data.size();
}


private class MyHolder extends RecyclerView.ViewHolder {

TextView textTitle;
ImageView ivAds;
TextView textPrice;

// create constructor to get widget reference
public MyHolder(View itemView) {
super(itemView);
textTitle = (TextView) itemView.findViewById(R.id.itemMainJson);

itemView.setClickable(true);
itemView.hasFocusable();
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Redraw the old selection and the new
notifyItemChanged(focusedItem);
focusedItem = getLayoutPosition();
notifyItemChanged(focusedItem);
}
});

}

}
}

我的 container_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_selector"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true">

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/all_haraj"
android:id="@+id/itemMainJson"
android:textSize="@dimen/text_main"
android:textColor="@color/black"
android:paddingRight="@dimen/padding_for_frogs"
android:paddingLeft="@dimen/padding_for_frogs"
android:paddingTop="@dimen/fab_press_translation_z"
android:paddingBottom="@dimen/fab_press_translation_z"/>

<ImageView
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/horizontal_line"
android:paddingTop="2dp"
android:paddingBottom="2dp"/>

</LinearLayout>

我的 RecycleView OnCLick 类

public class ItemClickSupport {
private final RecyclerView mRecyclerView;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
private View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
}
};
private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mOnItemLongClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
}
return false;
}
};
private RecyclerView.OnChildAttachStateChangeListener mAttachListener
= new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
if (mOnItemClickListener != null) {
view.setOnClickListener(mOnClickListener);
}
if (mOnItemLongClickListener != null) {
view.setOnLongClickListener(mOnLongClickListener);
}
}

@Override
public void onChildViewDetachedFromWindow(View view) {

}
};

private ItemClickSupport(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mRecyclerView.setTag(R.id.item_click_support, this);
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
}

public static ItemClickSupport addTo(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
if (support == null) {
support = new ItemClickSupport(view);
}
return support;
}

public static ItemClickSupport removeFrom(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
if (support != null) {
support.detach(view);
}
return support;
}

public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
return this;
}

public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
mOnItemLongClickListener = listener;
return this;
}

private void detach(RecyclerView view) {
view.removeOnChildAttachStateChangeListener(mAttachListener);
view.setTag(R.id.item_click_support, null);
}

public interface OnItemClickListener {

void onItemClicked(RecyclerView recyclerView, int position, View v);
}

public interface OnItemLongClickListener {

boolean onItemLongClicked(RecyclerView recyclerView, int position, View v);
}
}

我的选择器问题,当我选择项目时,我必须点击两次才能进行交互,然后再添加 clickablefocusablefocusableTouchMode到我的Layout ,第一次点击后生成 Action ,但选择器很快消失并且没有聚焦,我想让它聚焦在我选择的项目上,但单击一次而不是两次。

提前致谢:)

最佳答案

如果您只需要一个在用户触摸时更改项目背景的选择器,只需几行 xml 即可实现(根本无需更改 java 代码)。

我确实想知道为什么你在你的状态中“检查”和“聚焦”,而不是“选择”。我通常会像这样编写一个可绘制的选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/selected" android:state_activated="true"/>
<item android:drawable="@drawable/selected" android:state_pressed="true"/>
<item android:drawable="@drawable/selected" android:state_selected="true"/>
<item android:drawable="@drawable/unselected"/>
</selector>

但我要做的第一件事是暂时摆脱选择器背景,并验证代码是否在用户触摸某个项目时执行您想要的操作。这样,您可以确保基本代码正常工作。一旦你这样做了,您可以像这样将可绘制对象添加回您的 item_view 布局。

    android:background="@drawable/item_selector"

这就是我通常的做法(不更改一行代码)。我希望这个答案对您有所帮助。

关于java - RecyclerView 中的选择器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42913936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com