6

私はドロウアブルセレクタを持っています。RecycleViewのセレクタに関する問題

<?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); 
} 
} 

セレクタと私の問題は、私は対話をするために二回クリックする必要があります、と私は私のLayoutclickablefocusablefocusableTouchModeを追加する前に、最初にクリックした後に生成されたアクションセレクターはすばやく消えてフォーカスがないので、選択したアイテムに焦点を当てるが、ワンクリックでは2回しないようにしたい。事前に

感謝:)

+0

選択した項目にブール値を使用します。それらを配列に格納します。あなたがスクロールするとき、Recyclerviewはそれらを覚えています。 selectitembackgroundを使用してください(忘れてしまった)。それは –

+0

@ Log.dで動作するはずです。私はこの夢を私の夢の中で見ます:D – CODE1010101010101

+0

それはずっと前ですが、うまくいくはずです。いくつかの例ではGoogleの –

答えて

2

あなただけのユーザーがそれに触れたときのアイテムの背景を変更するセレクタをしたい場合は、これは(すべてでJavaコードを変更せずに)、XMLのほんの数行で実現することができます。

私はあなたが "選択"されていない "あなたの州の間で"集中 "した理由は不思議でした。私は通常、次のようにセレクタ描画可能にコーディングしたい:

<?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レイアウトにdrawableを追加するだけです。

android:background="@drawable/item_selector" 

そして、それは私が通常(コードの行を変更せずに)それを行うだろう方法です。私はあなたがこの回答が役立つことを願っています。

+0

は動作しません。 – CODE1010101010101

+0

あなたのコードはセレクタなしで何をしますか? –

+0

うん、それは完璧に働いている。 – CODE1010101010101