模型与视图的绑定,通过适配器来完成
普通用法:
继承RecyclerView.Adapter方式
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.soft_test_helper.R;
import com.example.soft_test_helper.pojo.Announcement;
import java.util.List;
public class AnnouncementAdapter extends RecyclerView.Adapter<AnnouncementAdapter.ViewHolder> {
private List<Announcement> announcementList;
public AnnouncementAdapter (List <Announcement> announcementList){
this.announcementList = announcementList;
}
/**
* Called when RecyclerView needs a new {@link ViewHolder} of the given type to represent
* an item.
* <p>
* This new ViewHolder should be constructed with a new View that can represent the items
* of the given type. You can either create a new View manually or inflate it from an XML
* layout file.
* <p>
* The new ViewHolder will be used to display items of the adapter using
* {@link #onBindViewHolder(ViewHolder, int, List)}. Since it will be re-used to display
* different items in the data set, it is a good idea to cache references to sub views of
* the View to avoid unnecessary {@link View#findViewById(int)} calls.
*
* @param parent The ViewGroup into which the new View will be added after it is bound to
* an adapter position.
* @param viewType The view type of the new View.
* @return A new ViewHolder that holds a View of the given view type.
* @see #getItemViewType(int)
* @see #onBindViewHolder(ViewHolder, int)
*/
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.announcement_item,parent,false);
return new ViewHolder(view);
}
/**
* Called by RecyclerView to display the data at the specified position. This method should
* update the contents of the {@link ViewHolder#itemView} to reflect the item at the given
* position.
* <p>
* Note that unlike {@link ListView}, RecyclerView will not call this method
* again if the position of the item changes in the data set unless the item itself is
* invalidated or the new position cannot be determined. For this reason, you should only
* use the <code>position</code> parameter while acquiring the related data item inside
* this method and should not keep a copy of it. If you need the position of an item later
* on (e.g. in a click listener), use {@link ViewHolder#getAdapterPosition()} which will
* have the updated adapter position.
* <p>
* Override {@link #onBindViewHolder(ViewHolder, int, List)} instead if Adapter can
* handle efficient partial bind.
*
* @param holder The ViewHolder which should be updated to represent the contents of the
* item at the given position in the data set.
* @param position The position of the item within the adapter's data set.
*/
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Announcement announcement = announcementList.get(position);
holder.titleTV.setText(announcement.getTitle());
holder.contentTV.setText(announcement.getContent());
holder.releaseTimeTV.setText(announcement.getReleaseTime());
}
/**
* Returns the total number of items in the data set held by the adapter.
*
* @return The total number of items in this adapter.
*/
@Override
public int getItemCount() {
return announcementList.size();
}
//静态内部类, 每个条目对应的布局
static class ViewHolder extends RecyclerView.ViewHolder {
TextView titleTV,contentTV,releaseTimeTV;
public ViewHolder (View view)
{
super(view);
titleTV = (TextView) view.findViewById(R.id.titleTV);
contentTV = (TextView) view.findViewById(R.id.contentTV);
releaseTimeTV = (TextView) view.findViewById(R.id.releaseTimeTV);
}
}
}
进阶版:
继承BaseQuickAdapter的方式
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.example.soft_test_helper.R;
import com.example.soft_test_helper.pojo.Announcement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class AnnouncementAdapter02 extends BaseQuickAdapter<Announcement, BaseViewHolder> {
public AnnouncementAdapter02(@Nullable List<Announcement> data) {
super(R.layout.announcement_item, data);
}
@Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, Announcement announcement) {
baseViewHolder.setText(R.id.titleTV,announcement.getTitle());
baseViewHolder.setText(R.id.contentTV,announcement.getContent());
baseViewHolder.setText(R.id.releaseTimeTV,announcement.getReleaseTime());
}
}
RecyclerView设置适配器 private RecyclerView recycleView; recycleView = findViewById(R.id.recycleView); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(AnnouncementActivity.this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recycleView.setLayoutManager(linearLayoutManager); AnnouncementAdapter02 adapter = new AnnouncementAdapter02(announcementList); recycleView.setAdapter(adapter); adapter.setOnItemClickListener(AnnouncementActivity.this);
fragmentPagerAdapter使用
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
public class PagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments; //需要显示的fragment
public PagerAdapter(@NonNull FragmentManager fm, List<Fragment> fragmentList) {
super(fm);
fragments = fragmentList;
}
@NonNull
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public long getItemId(int position) { //原本返回的是位置,导致数据item删除后,不是当前的item,无法正确移除
return fragments.get(position).hashCode();
}
}
ViewPager设置适配器 private ViewPager pager; pager = findViewById(R.id.pager);PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(),fragments); pager.setAdapter(pagerAdapter);