6

Ich habe meine Drawable Selektor.Problem mit Selektor auf 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"/> 

und das ist mein RecycleView Adapter

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

    } 

} 
} 

mein 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> 

Mein RecycleView ONCLICK Klasse

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

mein Problem mit Selektor, wenn ich Artikel gewählt, ich habe zweimal klicken Interaktion zu machen, und bevor ich hinzugefügt clickable und focusable und focusableTouchMode meinen Layout, Aktion erzeugte nach dem ersten Klick aber der Selektor verschwindet schnell und fokussiert nicht, ich möchte es auf den ausgewählten Gegenstand fokussieren, aber mit einem Klick nicht zweimal.

Vielen Dank im Voraus :)

+0

Verwenden Sie den booleschen Wert für das ausgewählte Element. Speichern Sie sie in einem Array. Recyclerview merkt sich diese beim Scrollen. Verwenden Sie selectitembackground (vergessen). Es sollte funktionieren –

+0

@ Log.d Ich sehe dieses Problem in meinem Traum: D – CODE1010101010101

+0

Es hat lange her, aber es sollte funktionieren. Google für ein Beispiel –

Antwort

2

Wenn Sie nur einen Selektor, der die Sache des Hintergrund ändert sich, wenn der Benutzer sie berührt, kann dies mit nur wenigen Zeilen von XML implementiert werden (ohne den Java-Code überhaupt zu ändern) .

Ich habe mich gefragt, warum Sie "überprüft" und "konzentriert" unter Ihren Staaten, aber nicht "ausgewählt". Ich würde normalerweise einen Selektor ziehbar wie diesen Code:

<?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> 

Aber das erste, was ich vorübergehend des Wählers Hintergrund loszuwerden, ist, tun würde, und stellen Sie sicher, dass der Code tut, was Sie wollen, wenn ein Benutzer ein Element berührt. Auf diese Weise können Sie sicherstellen, dass der Basiscode funktioniert. Sobald Sie das getan haben, können Sie einfach die ziehbare zurück zu Ihrem item_view-Layout wie folgt hinzufügen.

android:background="@drawable/item_selector" 

Und so würde ich es normalerweise machen (ohne eine Codezeile zu ändern). Ich hoffe, Sie finden diese Antwort hilfreich.

+0

does't Arbeit .. – CODE1010101010101

+0

Also, tut Ihr Code, was Sie wollen, ohne den Selektor? –

+0

ja, es hat perfekt funktioniert. – CODE1010101010101