본문 바로가기

Android

Android studio Recycler view 정리.

반응형

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


}

반응형