recycler view
recycle view 지정영역에서 item으로 사용하는 xml이 반복 해서 list 구조로 나타남.
원리는 recycle xml에서 내부에 심을 item xml 을 tool로 엮음.
tools:listitem="@layout/activity_item" 이런 식.
그리고나서 item xml에서 사용하고 있는 text ,image에 대한 입력을 받을 데이터 객체를 만듬.
<Itemdata>
public class Iteminfo {
String text1;
String text2;
private int resId;
public int getResId()
{
return resId;
}
public void setResId(int resId) {
this.resId = resId;
}
public String getText1() {
return text1;
}
public void setText1(String text1) {
this.text1 = text1;
}
public String getText2() {
return text2;
}
public void setText2(String text2) {
this.text2 = text2;
}
}
나는 Item에 간단하게 두 개의 텍스트만을 포함 시켰으므로 이렇게 구성함.
참고로 내 코드에서는 생성자 필요 x
그리고 나서 recycle activity에서 해줘야 하는 작업은 우선 recyclerview에 대한 binding이 필요함.
그리고나서 adapter와 recyclerview 를 연결시켜줘야됨.
전체 적인 틀로 보면 recyclerview 와 adapter를 연결 하고 adapter에 Item을 채울 데이터를 넣어주면
adapter에서 데이터를 받아서 Item을 채우는 구조.
나는 메인에서 Recyclerview를 만들었다.
<리사이클러가 포함된 엑티비티>
public class MainActivity extends AppCompatActivity {
@BindView(R.id.recycle)
RecyclerView recyclerView; //바인딩 시켜주고
LinearLayoutManager linearLayoutManager;
RecyclerViewAdapter recyclerViewAdapter; //어댑터 클래스를 만듬.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.addItemDecoration(
new DividerItemDecoration(this,linearLayoutManager.getOrientation()));
recyclerView.setLayoutManager(linearLayoutManager); //이부분은 그냥 복붙으로 해주기로 한다. 공용 사용부분.
recyclerViewAdapter = new RecyclerViewAdapter();
recyclerView.setAdapter(recyclerViewAdapter); //아까 만든 어댑터 객체를 생성해서 set시킴.
List<String> listtext1= Arrays.asList("사랑해요","고마워요","미안해요");
List<String> listtext2= Arrays.asList("나도","너를","사랑해");
List<Integer> listResId = Arrays.asList(
R.drawable.com_intel,
R.drawable.ic_launcher_background,
R.drawable.ic_launcher_foreground
);
//각 Text에 대한 List를 만들어서 Item 데이터 객체에 입력 시키도록함.
for(int i=0; i<listtext1.size(); i++)
{
Iteminfo item= new Iteminfo(); //Item 데이터를 갖는 객체를 생성시켜서
item.setText1(listtext1.get(i)); //각 Text에 대한 데이터를 입력 시켜줌.
item.setText2(listtext2.get(i));
item.setResId(listResId.get(i));
recyclerViewAdapter.addItem(item);
//그리고 그 입력된 데이터를 어뎁터에 추가시킴. 어뎁터에서는 Iteminfo형의 Arraylist가 이를 한 칸씩 채워 넣음
}
}
}
<어뎁터>
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ItemViewHolder> {
Context context;
//이거는 아이템을 클릭했을 때 다른엑티비티로 넘어가기 위해 설정 .엑티비티에서 엑티비티 이동은 Context가 딱히 필요 없어 보인다만, 클래스에서 엑티비티로 이동시 필요한 것으로 추정됨.
ArrayList<Iteminfo> listData =new ArrayList<>();
//넘어온 데이터를 담을 객체형 Arraylist를 선언.
@NonNull
@Override
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// LayoutInflater를 이용하여 전 단계에서 만들었던 item.xml을 inflate 시킵니다.
// return 인자는 ViewHolder 입니다.
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_item, parent, false);
return new ItemViewHolder(view);
//메인에서 RecyclerView를 바인딩하고 어댑터에 연결 시켰다면 어뎁터에서는 Recycler뷰에 들어갈 Item xml을 //Adapter에 연결 시킴. 따라서 리사이클러 뷰와 아이템 xml을 연결시킴.
}
@Override
public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
// Item을 하나, 하나 보여주는(bind 되는) 함수입니다.
holder.onBind(listData.get(position));
}
@Override
public int getItemCount() {
// RecyclerView의 총 개수 입니다.
return listData.size();
}
void addItem(Iteminfo data) {
// 외부에서 item을 추가시킬 함수입니다.
listData.add(data);
//아까 메인에서 넘긴 데이터는 이렇게 여기서 쌓임. 즉 addItem함수를 통해 listData를 만듬.
}
class ItemViewHolder extends RecyclerView.ViewHolder {
//이곳에서 각 Text나 Image를 바인딩 시키고 클릭이벤트에 대한 처리도 함. 클릭이벤트는 바인딩과 동시에 진행하므로,,
@BindView(R.id.text1)
TextView text1;
@BindView(R.id.text2)
TextView text2;
@BindView(R.id.rcimage)
ImageView rcimage;
@BindView(R.id.item_root)
LinearLayout itemroot;
@OnClick(R.id.item_root)
public void OnClickRoot(View v) {
if (v.equals(itemroot)) {
// //type casting
//// ((ListActivity) context)
//// .setBaseData(
//// getAdapterPosition()
//// );
////
Intent intent = new Intent(context, ItemActivity.class);
intent.putExtra("Text2", listData.get(getAdapterPosition()).getText2());
intent.putExtra("Text1", listData.get(getAdapterPosition()).getText1());
//이 부분은 다음엑티비티로 넘어가면서 매개변수를 전달하는 방식인데 다음 글에서 설명하도록 함.
context.startActivity(intent);
}
}
ItemViewHolder(View itemView) {
super(itemView);
}
void onBind(Iteminfo data) {
text1.setText(data.getText1());
text2.setText(data.getText2());
rcimage.setImageResource(data.getResId());
}
}
}
'Android' 카테고리의 다른 글
Android studio Glide다루기 (0) | 2019.07.19 |
---|---|
Android studio putextra로 Intent 값 전달하기. (0) | 2019.07.12 |
Android studio 딜레이 생성. (0) | 2019.07.10 |
Android studio text를 String객체로 빼오기. (0) | 2019.07.09 |
android studio 사라지는 프레임 (0) | 2019.07.05 |