Android 如何在“中迁移我的代码”;onCreateViewHolder“;至;onBindViewHolder";
这是我在onCreateViewHolder中的代码 有人告诉我,在那里写不是一个好习惯,它应该在onBindViewHolder中 尽管我在网上看了一些例子,但我似乎不知道如何正确地完成它Android 如何在“中迁移我的代码”;onCreateViewHolder“;至;onBindViewHolder";,android,android-recyclerview,Android,Android Recyclerview,这是我在onCreateViewHolder中的代码 有人告诉我,在那里写不是一个好习惯,它应该在onBindViewHolder中 尽管我在网上看了一些例子,但我似乎不知道如何正确地完成它 那么,我应该如何处理这个问题呢?onCreateViewHolder()应该包含创建ViewHolder的代码,并且onBindViewHolder()应该用数据填充它。当集合包含许多元素并由用户滚动时,任何其他方法都会导致问题 就我所见,在您的例子中,无论CAT\u IMAGE\u id.get(I).g
那么,我应该如何处理这个问题呢?onCreateViewHolder()应该包含创建ViewHolder的代码,并且
onBindViewHolder()应该用数据填充它。当集合包含许多元素并由用户滚动时,任何其他方法都会导致问题
就我所见,在您的例子中,无论CAT\u IMAGE\u id.get(I).getButton()
和CAT\u IMAGE\u id.get(I).getDummy()的值是多少,创建的布局都是一样的。这意味着onBindViewHolder()
的主体应该如下所示:
ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(R.layout.widget_holder, parent, false);
LinearLayout ln = new LinearLayout(parent.getContext());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(230, 250, Gravity.CENTER);
ln.setLayoutParams(params);
viewGroup.addView(ln);
return new ItemViewHolder(viewGroup);
请注意,我只留下了实际创建布局的代码,而没有留下设置可见性的部分-应该在onBindViewHolder()中完成
通常,onBindViewHolder()的onBindViewHolder()
不仅仅用于更改元素的可见性,例如,用文本和图片填充视图
您可以获取更多信息。这里缺少的逻辑只是利用这种方法并相应地回收您的视图。请看以下示例代码:
package yourpackage.goeshere;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import yourpackage.goeshere.R;
public class SampleRecyclerViewAdapter2 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//region Vars
private List<Object> mListObjects;
private LayoutInflater mInflater;
private Context context;
//endregion
//region Constructor
public SampleRecyclerViewAdapter2(@NonNull Context context){
this.context = context;
this.mInflater = LayoutInflater.from(this.context);
}
//endregion
//region Initialization
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.your_layout_file_here, parent, false);
SampleRecyclerViewAdapter2.AdapterHolderType viewHolder2 = new SampleRecyclerViewAdapter2.AdapterHolderType(view);
return viewHolder2;
}
//endregion
//region Override Methods
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder0, final int position) {
final Object nonCastObject = mListObjects.get(position);
if(nonCastObject == null){
//Decide what to do here
return;
}
//Cast the Holder Here
SampleRecyclerViewAdapter2.AdapterHolderType holder = (SampleRecyclerViewAdapter2.AdapterHolderType) holder0;
//Cast the Object Here to your pojo
// MyCustomObject obj = (MyCustomObject) nonCastObject;
//Set Fields here; adjust dynamically from cast object
holder.adapter_sample_recyclerview_iv.setImageResource(R.mipmap.ic_launcher);
holder.adapter_sample_recyclerview_tv.setText("Some text");
//Set listeners here
holder.rootview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Can set a click listener here if need be
}
});
//Handle animations here if you want them
}
@Override
public int getItemCount() {
return ((this.mListObjects == null) ? 0 : this.mListObjects.size());
}
//endregion
//region Class Methods
/**
* Add one object to the list
* @param position Position to add into
* @param mObject Single object to update. If null, will be ignored (Call remove instead).
* {@link Object}
*/
public void addOneObject(int position, Object mObject){
if(mObject == null){
return;
}
if(position < 0 || position > getItemCount()){
//Out of bounds
return;
}
if(this.mListObjects == null){
this.mListObjects = new ArrayList<>();
}
this.mListObjects.add(position, mObject);
this.notifyItemChanged(position);
}
/**
* Update one object in the list
* @param position Position to update
* @param mObject Single object to update. If null, will be ignored (Call remove instead).
* {@link Object}
*/
public void updateOneObject(int position, Object mObject){
if(mObject == null){
return;
}
if(position < 0 || position >= getItemCount()){
//Out of bounds
return;
}
this.mListObjects.set(position, mObject);
this.notifyItemChanged(position);
}
/**
* Remove a single object from the list
* @param position Position to remove
*/
public void removeOneObject(int position){
if(this.mListObjects != null){
if(position < 0 || position >= getItemCount()){
this.mListObjects.remove(position);
this.notifyItemChanged(position);
}
}
}
/**
* Set data list
* @param mListObjects {@link Object}
*/
public void setListObjects(List<Object> mListObjects){
this.mListObjects = mListObjects;
this.notifyDataSetChanged();
}
//endregion
//region Class Holders
class AdapterHolderType extends RecyclerView.ViewHolder {
ImageView adapter_sample_recyclerview_iv;
RelativeLayout rootview;
TextView adapter_sample_recyclerview_tv;
public AdapterHolderType(View itemView) {
super(itemView);
this.adapter_sample_recyclerview_tv = itemView.findViewById(R.id.adapter_sample_recyclerview_tv);
this.rootview = itemView.findViewById(R.id.rootview);
this.adapter_sample_recyclerview_iv = itemView.findViewById(R.id.adapter_sample_recyclerview_iv);
}
}
//endregion
}
package yourpackage.goesher;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.List;
导入androidx.annotation.NonNull;
导入androidx.recyclerview.widget.recyclerview;
导入您的包;
公共类SampleRecyclerViewAdapter2扩展了RecyclerView.Adapter{
//区域变量
私有列表mListObjects;
私人停车场;
私人语境;
//端区
//区域构造函数
公共采样器ECyclServiceAdapter2(@NonNull上下文){
this.context=上下文;
this.mInflater=LayoutInflater.from(this.context);
}
//端区
//区域初始化
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View View=mInflater.inflate(R.layout.your\u layout\u file\u here,parent,false);
SampleRecyclServiceAdapter2.AdapterHolderType视图持有者2=新SampleRecyclServiceAdapter2.AdapterHolderType(视图);
返回viewHolder2;
}
//端区
//区域覆盖方法
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder holder0,最终int位置){
最终对象nonCastObject=mListObjects.get(位置);
if(nonCastObject==null){
//决定在这里做什么
返回;
}
//把支架放在这里
SamplerCyclerServiceAdapter2.AdapterHolderType持有者=(SamplerCyclerServiceAdapter2.AdapterHolderType)持有者0;
//将此对象投射到您的pojo
//MyCustomObject obj=(MyCustomObject)非CastObject;
//在此处设置字段;根据强制转换对象动态调整
holder.adapter\u sample\u recyclerview\u iv.setImageResource(R.mipmap.ic\u启动器);
holder.adapter\u sample\u recyclerview\u tv.setText(“一些文本”);
//在此处设置侦听器
holder.rootview.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//如果需要,可以在此处设置单击侦听器
}
});
//如果需要,请在此处处理动画
}
@凌驾
public int getItemCount(){
返回((this.mListObjects==null)?0:this.mListObjects.size();
}
//端区
//区域类方法
/**
*将一个对象添加到列表中
*@param position要添加到的位置
*@param mObject要更新的单个对象。如果为null,将被忽略(改为调用remove)。
*{@link Object}
*/
public void addOneObject(int位置,Object mObject){
if(mObject==null){
返回;
}
如果(位置<0 | |位置>getItemCount()){
//出界
返回;
}
if(this.mListObjects==null){
this.mListObjects=新的ArrayList();
}
this.mListObjects.add(position,mObject);
此项变更(位置);
}
/**
*更新列表中的一个对象
*@param-position要更新的位置
*@param mObject要更新的单个对象。如果为null,将被忽略(改为调用remove)。
*{@link Object}
*/
public void updateOneObject(int位置,Object mObject){
if(mObject==null){
返回;
}
如果(位置<0 | |位置>=getItemCount()){
//出界
返回;
}
this.mListObjects.set(位置,mObject);
此项变更(位置);
}
/**
*从列表中删除单个对象
*@param-position要删除的位置
*/
public void removeOneObject(int位置){
if(this.mListObjects!=null){
如果(位置<0 | |位置>=getItemCount()){
此.mListObjects.remove(位置);
此项变更(位置);
}
}
}
/**
*设置数据列表
*@param mListObjects{@link Object}
*/
public void setListObjects(列表mlistObject){
this.mListObjects=mListObjects;
this.notifyDataSetChanged();
}
//端区
//地区级持有人
类AdapterHolderType扩展了RecyclerView.ViewHolder{
ImageView适配器\u样本\u回收视图\u iv;
相对论根视图;
TextView适配器\u示例\u回收
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (CAT_IMAGE_IDS.get(position).getButton()){
holder.itemView.setVisibility(View.VISIBLE);
} else if (CAT_IMAGE_IDS.get(position).getDummy()){
holder.itemView.setVisibility(View.INVISIBLE);
}
}
package yourpackage.goeshere;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import yourpackage.goeshere.R;
public class SampleRecyclerViewAdapter2 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//region Vars
private List<Object> mListObjects;
private LayoutInflater mInflater;
private Context context;
//endregion
//region Constructor
public SampleRecyclerViewAdapter2(@NonNull Context context){
this.context = context;
this.mInflater = LayoutInflater.from(this.context);
}
//endregion
//region Initialization
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.your_layout_file_here, parent, false);
SampleRecyclerViewAdapter2.AdapterHolderType viewHolder2 = new SampleRecyclerViewAdapter2.AdapterHolderType(view);
return viewHolder2;
}
//endregion
//region Override Methods
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder0, final int position) {
final Object nonCastObject = mListObjects.get(position);
if(nonCastObject == null){
//Decide what to do here
return;
}
//Cast the Holder Here
SampleRecyclerViewAdapter2.AdapterHolderType holder = (SampleRecyclerViewAdapter2.AdapterHolderType) holder0;
//Cast the Object Here to your pojo
// MyCustomObject obj = (MyCustomObject) nonCastObject;
//Set Fields here; adjust dynamically from cast object
holder.adapter_sample_recyclerview_iv.setImageResource(R.mipmap.ic_launcher);
holder.adapter_sample_recyclerview_tv.setText("Some text");
//Set listeners here
holder.rootview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Can set a click listener here if need be
}
});
//Handle animations here if you want them
}
@Override
public int getItemCount() {
return ((this.mListObjects == null) ? 0 : this.mListObjects.size());
}
//endregion
//region Class Methods
/**
* Add one object to the list
* @param position Position to add into
* @param mObject Single object to update. If null, will be ignored (Call remove instead).
* {@link Object}
*/
public void addOneObject(int position, Object mObject){
if(mObject == null){
return;
}
if(position < 0 || position > getItemCount()){
//Out of bounds
return;
}
if(this.mListObjects == null){
this.mListObjects = new ArrayList<>();
}
this.mListObjects.add(position, mObject);
this.notifyItemChanged(position);
}
/**
* Update one object in the list
* @param position Position to update
* @param mObject Single object to update. If null, will be ignored (Call remove instead).
* {@link Object}
*/
public void updateOneObject(int position, Object mObject){
if(mObject == null){
return;
}
if(position < 0 || position >= getItemCount()){
//Out of bounds
return;
}
this.mListObjects.set(position, mObject);
this.notifyItemChanged(position);
}
/**
* Remove a single object from the list
* @param position Position to remove
*/
public void removeOneObject(int position){
if(this.mListObjects != null){
if(position < 0 || position >= getItemCount()){
this.mListObjects.remove(position);
this.notifyItemChanged(position);
}
}
}
/**
* Set data list
* @param mListObjects {@link Object}
*/
public void setListObjects(List<Object> mListObjects){
this.mListObjects = mListObjects;
this.notifyDataSetChanged();
}
//endregion
//region Class Holders
class AdapterHolderType extends RecyclerView.ViewHolder {
ImageView adapter_sample_recyclerview_iv;
RelativeLayout rootview;
TextView adapter_sample_recyclerview_tv;
public AdapterHolderType(View itemView) {
super(itemView);
this.adapter_sample_recyclerview_tv = itemView.findViewById(R.id.adapter_sample_recyclerview_tv);
this.rootview = itemView.findViewById(R.id.rootview);
this.adapter_sample_recyclerview_iv = itemView.findViewById(R.id.adapter_sample_recyclerview_iv);
}
}
//endregion
}