RecyclerView(Item Click) 1탄

Posted by ITPangPang
2016. 4. 6. 00:38 안드로이드(android)/Recyclerview


RecyclerView(Item Click) 1탄


- 이번글에서는 아주 간단하게 List에 있는 Item을 클릭하는 
  방법과 Item을 클릭할때 pressed(눌림) 효과를 줘본다

- Item을 선택하는 방법에는 여러방법이 많지만 첫번째로 해 볼 
  방법은 가장 심플하고 쉽게 사용하고 많이 사용하는
  onBindViewHolder에서 setOnClickListener를 설정하는 것이다.

- 원래는 item 선택이랑 notify랑 묶어서 글을 쓰려고 했는데, 
   pressed에다가 Item Click 후 처리까지 하고 notify까지 
  하려면 길어질 것 같아서 일단 notify는 다음으로 미뤘다

① 간단하게 EditText에 Text를 입력후 버튼을 누르면 Item이 생성되고

② List에 있는 Item을 선택할 때 pressed 효과를 넣고 토스트를 띄운다.




1. activity_main.xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<EditText
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btn"
android:text="입력하기"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:background="@drawable/bg"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

</LinearLayout>

EditText 1개, Button 1개, RecyclerView 1개를 넣었다.
원래 Strings.xml에 text를 넣어서 써야 되는데 귀찮아서 생략한다.

2. recyclerview_custom.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv"
android:textColor="#000000"
android:textSize="20sp"
android:layout_margin="10dp"
android:gravity="center"
android:background="@drawable/tv_selector"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
여기도 별 거 없이 TextView 1개 이다.
여기서도 Color를 따로 모아놔야되는데 생략한다.

3. bg.xml(RecyclerView의 배경이다)
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid
android:color="#ff36d218"/>
<stroke
android:width="2dp"
android:color="#000000"
android:dashWidth="1dp"
android:dashGap="0dp" />
<padding
android:left="7dp"
android:top="7dp"
android:right="7dp"
android:bottom="7dp" />
<corners
android:radius="2dp" />
</shape>
[res]-[drawable] 폴더 안에 넣으면 된다.

4. tv_selector.xml(Item을 누르는 과정에서 눌렸을때 효과를 준다)
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/tv_off"
android:state_pressed="false"
/>
<item
android:drawable="@drawable/tv_on"
android:state_pressed="true"
/>
</selector>
보면 알겠듯이 state_pressed가 
false일때는 기본상태이고
true일때가 눌렸을때이다.
android:drawable에 false,true일때의 속성을 넣어준다.

5.tv_off.xml(Item이 눌리기전 기본상태이다)
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">
<solid android:color="#fffcffa5"/>
<corners
android:bottomRightRadius="5dp"
android:bottomLeftRadius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp"/>
<stroke android:width="2dp"
android:color="#000000"
/>
</shape>


6.tv_on.xml(Item이 눌리는 순간이다)
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">
<solid android:color="#ffffb925"/>
<corners
android:bottomRightRadius="5dp"
android:bottomLeftRadius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp"/>
<stroke android:width="2dp"
android:color="#000000"
/>
</shape>
보면 알겠지만 나머지 속성은 그대로이고
solid에서만 변화를 주었다.

7. MainActivity.java
public class MainActivity extends Activity
{
RecyclerView rv;
LinearLayoutManager llm;
List<String> count = null;
Button btn;
EditText et = null;
String text;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

et = (EditText)findViewById(R.id.et);
rv = (RecyclerView)findViewById(R.id.rv);
btn = (Button)findViewById(R.id.btn);
llm = new LinearLayoutManager(this);
rv.setHasFixedSize(true);
rv.setLayoutManager(llm);

count = new ArrayList<>();

btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
text = et.getText().toString();
count.add(text);
rv.setAdapter(new CountAdapter(getApplication(), count, text));
}
});
}
}

저번이랑 코드가 거의 똑같다
count는 저번글에 변수명이었는데
실수로 못바꿨다. 
그냥 String형이다.

8.CountAdapter.java
public class CountAdapter extends RecyclerView.Adapter<CountAdapter.MyViewHolder>
{
Context mContext;
List<String> items;
String text;


public CountAdapter(Context c, List<String> items, String text)
{
this.mContext = c;
this.items = items;
this.text = text;
}
@Override
public CountAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerview_custom, viewGroup, false);
return new MyViewHolder(v);
}

@Override
public void onBindViewHolder(CountAdapter.MyViewHolder myViewHolder, int position)
{
final String item = items.get(position);
myViewHolder.tv.setText("" + item);
myViewHolder.tv.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Toast.makeText(mContext,item,Toast.LENGTH_SHORT).show();
}
});
}


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

public class MyViewHolder extends RecyclerView.ViewHolder
{
TextView tv;
public MyViewHolder(View itemView)
{
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv);
}
}
}

여기서도 그냥 setOnClickListener 달아준 것 밖에 없다.
Item 선택하는 방법중 이게 가장 쉽다.


이번글은 간단히 Item선택시 Item내용을 Toast 띄우고
Xml로 ShapeDrawable 만드는 것만 하였다.

ShapeDrawable은 따로 xml 카테고리에서 
분석할 예정이다.

그냥 다음글 쓰기전에 미리 
색깔좀 넣어보고 싶어서
써봤다.


'안드로이드(android) > Recyclerview' 카테고리의 다른 글

RecyclerView(Item Click) 2탄  (8) 2016.04.07
RecyclerView.Adapter, ViewHolder(추가)  (3) 2016.04.03
RecyclerView.Adapter, ViewHolder  (3) 2016.04.02
RecyclerView 기본  (2) 2016.04.02
RecyclerView  (0) 2016.04.01