2017-07-14 17 views
1

activity_main.xmlでは、id infoのTextViewを使用して、item_nameというIDを持つrecycler_viewリストのクリックされたテキストを表示しています。 Recyclerビューには、100個のアイテムのリストが名前とトグルで表示され、それらをアクティブおよび非アクティブにします。私item.xml エスプレッソアンドロイドを使用して、recyclerviewのトグルボタンを特定の位置でオンまたはオフにする方法は?

public class MainActivity extends AppCompatActivity 
{ 

public static final String ITEM_NAME_FORMAT = "Item :%d"; 
public static final String ITEM_SELECTED_FORMAT = "%s is selected."; 
public static final String INFO_HINT = "Click on item!"; 
private ActivityMainBinding mBinding; 
private List<Item> mMainList = new ArrayList<>(); 
private RecyclerAdapter mAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); 

    initViews(); 
} 

private void initViews() { 

    mBinding.info.setHint(INFO_HINT); 

    for (int i = 0; i < 100; i++) { 
     mMainList.add(new Item(String.format(Locale.getDefault(), ITEM_NAME_FORMAT, i), false)); 
    } 
    mAdapter = new RecyclerAdapter(mMainList, new HandleAdapterActions()); 
    mBinding.recyclerView.setAdapter(mAdapter); 
} 

public void eraseInfo(View view) { 
    mBinding.info.setText(""); 
} 

private class HandleAdapterActions implements AdapterItemsClickHandler { 

    @Override 
    public void onItemNameClick(Item item) { 
     mBinding.info.setText(String.format(Locale.getDefault(), ITEM_SELECTED_FORMAT, item.getName())); 
    } 

    @Override 
    public void onToggleClick(Item item) { 
     item.setOn(!item.getOn()); 
     mAdapter.notifyItemChanged(mMainList.indexOf(item)); 
    } 
} 
} 

MainActivity.java

ここ

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

<data> 

    <variable 
     name="item" 
     type="com.app.recyclerviewtesting.Item" /> 

    <variable 
     name="listener" 
     type="com.app.recyclerviewtesting.AdapterItemsClickHandler" /> 
</data> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="15dp"> 

    <android.support.v7.widget.AppCompatTextView 
     android:id="@+id/item_name" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:onClick="@{() -> listener.onItemNameClick(item)}" 
     android:text="@{item.name}" 
     android:textSize="20sp" /> 

    <ToggleButton 
     android:id="@+id/toggle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:layout_centerHorizontal="true" 
     android:checked="@{item.on}" 
     android:onClick="@{() -> listener.onToggleClick(item)}" 
     tools:ignore="RelativeOverlap" /> 
</RelativeLayout> 
</layout> 

される。ここ 次のとおりです。ここで

は私のactivity_main.xmlすなわちリサイクルビューで使用

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="com.app.recyclerviewtesting.MainActivity"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/info" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:onClick="eraseInfo" 
     android:padding="20dp" 
     android:textColor="#000000" 
     android:textColorHint="#999999" /> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layoutManager="LinearLayoutManager" /> 
</LinearLayout> 
</layout> 

項目ですこちらはアダプターです

public class RecyclerAdapter extends 
RecyclerView.Adapter<RecyclerView.ViewHolder> 
{ 

private final int ITEM_VIEW_TYPE = 1; 
private List<Item> mainList; 
private AdapterItemsClickHandler mListener; 

public RecyclerAdapter(List<Item> mainList, AdapterItemsClickHandler mListener) { 
    this.mainList = mainList; 
    this.mListener = mListener; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RecyclerView.ViewHolder viewHolder; 
    if (viewType == ITEM_VIEW_TYPE) { 
     final ItemBinding binding = ItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); 
     binding.setListener(mListener); 
     viewHolder = new ItemViewHolder(binding); 
    } else { 
     viewHolder = null; 
    } 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (holder instanceof ItemViewHolder) { 
     ItemViewHolder itemViewHolder = (ItemViewHolder) holder; 
     final ItemBinding binding = itemViewHolder.binding; 

     Item item = mainList.get(position); 
     binding.setItem(item); 
    } 
} 

@Override 
public int getItemCount() { 
    return mainList.size(); 
} 

@Override 
public int getItemViewType(int position) { 
    return ITEM_VIEW_TYPE; 
} 

public class ItemViewHolder extends RecyclerView.ViewHolder { 

    public ItemBinding binding; 

    ItemViewHolder(ItemBinding binding) { 
     super(binding.getRoot()); 
     this.binding = binding; 
    } 
} 
} 

位置15のトグルをオンまたはオフにすると、テストケースを書く方法を見つけるのを手伝ってください。ここで

+0

クリックしたときにオン/オフ切り替えのための真/偽にこのフィールドの状態をモデル化し、更新するあなたの中にブールフィールドを取ります。また、togglebtn.isChecked()をチェックしてtogglebtn.setChecked(true/false)を取得します。値を設定します。 –

+0

このリンクをご覧くださいhttps://stackoverflow.com/questions/30017498/toggle-switch-in-recyclerview-programatically –

+0

この機能は既に動作しています。私はエスプレッソでこれについてテストケースを書く方法を知りたいだけです。 item.xmlとbinding.setItem(item)のandroid:checked = "@ {item.on}"を参照してください。アダプターに入れます。 – Monjo

答えて

1

は、この問題の解決策です:

public static Matcher<View> withToggleMatcher(final int position) { 
    return new BoundedMatcher<View, RecyclerView>(RecyclerView.class) { 

     @Override 
     public void describeTo(Description description) { 

     } 

     @Override 
     protected boolean matchesSafely(RecyclerView recyclerView) { 
      final RecyclerAdapter.ItemViewHolder viewHolder = (RecyclerAdapter.ItemViewHolder) recyclerView.findViewHolderForAdapterPosition(position); 
      return viewHolder.binding.toggle.isChecked(); 
     } 
    }; 
} 

@Test 
public void checkIfToggleIsOnAfterClickOnIt() { 

    int position = 15; 

    String itemName = String.format(Locale.getDefault(), MainActivity.ITEM_NAME_FORMAT, position); 

    onView(withId(R.id.recyclerView)) 
      .perform(RecyclerViewActions.scrollToPosition(position)); 

    onView(allOf(withId(R.id.toggle), hasSibling(withText(itemName)))) 
      .perform(click()); 

    onView(withId(R.id.recyclerView)) 
      .check(matches(withToggleMatcher(position))); 
} 
関連する問題