将 ViewHolder 与 ListView 一起使用
Using ViewHolder With ListView
我正在使用 ListView 列出文本和图像,但我想使用 ViewHolder 使滚动更流畅我已经尝试过但不太正确我必须如何修改代码
我试过的一些图片没有显示出来
@Override
public int getCount() {
return text1.length;
}
@Override
public Object getItem(int position) {
return text1[position];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater infla=getActivity().getLayoutInflater();
View v = infla.inflate(R.layout.list_view_layout, null);
TextView tv1 = (TextView) v.findViewById(R.id.textView1);
ImageView iv1 = (ImageView) v.findViewById(R.id.imageView1);
TextView tv2 = (TextView) v.findViewById(R.id.textView2);
ImageView iv2 = (ImageView) v.findViewById(R.id.imageView2);
TextView tv3 = (TextView) v.findViewById(R.id.textView3);
ImageView iv3 = (ImageView) v.findViewById(R.id.imageView3);
TextView tv4 = (TextView) v.findViewById(R.id.textView4);
ImageView iv4 = (ImageView) v.findViewById(R.id.imageView4);
TextView tv5 = (TextView) v.findViewById(R.id.textView5);
ImageView iv5 = (ImageView) v.findViewById(R.id.imageView5);
TextView tv6 = (TextView) v.findViewById(R.id.textView6);
ImageView iv6 = (ImageView) v.findViewById(R.id.imageView6);
TextView tv7 = (TextView) v.findViewById(R.id.textView7);
ImageView iv7 = (ImageView) v.findViewById(R.id.imageView7);
tv1.setText(text1[position]);
iv1.setImageResource(text2[position]);
tv2.setText(text3[position]);
iv2.setImageResource(text4[position]);
tv3.setText(text5[position]);
iv3.setImageResource(text6[position]);
tv4.setText(text7[position]);
iv4.setImageResource(text8[position]);
tv5.setText(text9[position]);
iv5.setImageResource(text10[position]);
tv6.setText(text11[position]);
iv6.setImageResource(text12[position]);
tv7.setText(text13[position]);
iv7.setImageResource(text14[position]);
if(text2[position]==R.drawable.ic_star){
iv1.setVisibility(View.GONE);
}if(text3[position].matches("")) {
tv2.setVisibility(View.GONE);
}if(text4[position]==R.drawable.ic_star){
iv2.setVisibility(View.GONE);
}if(text5[position].matches("")) {
tv3.setVisibility(View.GONE);
}if(text6[position]==R.drawable.ic_star){
iv3.setVisibility(View.GONE);
}if(text7[position].matches("")){
tv4.setVisibility(View.GONE);
}if(text8[position]==R.drawable.ic_star){
iv4.setVisibility(View.GONE);
}if(text9[position].matches("")){
tv5.setVisibility(View.GONE);
}if(text10[position]==R.drawable.ic_star){
iv5.setVisibility(View.GONE);
}if(text11[position].matches("")){
tv6.setVisibility(View.GONE);
}if(text12[position]==R.drawable.ic_star){
iv6.setVisibility(View.GONE);
}if(text13[position].matches("")){
tv7.setVisibility(View.GONE);
}if(text14[position]==R.drawable.ic_star){
iv7.setVisibility(View.GONE);
}
return v;
}
首先,您需要一个静态 ViewHolder Class 来保存您在适配器中的视图。
更像这个:
static class ViewHolder {
public TextView text;
public ImageView image;
}
并且该 viewholder 将用作视图的持有者,您在 getView
方法中初始化了它的视图并将其设置为标签,以便您稍后可以将其回收用于列表中的其他项目。
您可以按照this link应用listview的viewholder模式
您需要使用 getView()
中发送的 convertView
方法来优化工作。
阅读我的 blog 正确优化 ListView。
Viewholder 模式用于在容器中缓存列表项的视图 class 因此您不必为 [=] 中的每个列表项调用 inflate view 或 findViewById()
11=]。通过创建一个 class 可以保留对列表项中所有 ChildViews 的引用。通常这是内部静态 class.
getView()
方法中的View convertView,
参数是Android系统已经缓存的视图。因此,您从 if 语句开始,如果 convertView 为 null,则在其中扩充列表项。您还在那里的查看器上设置了所有子视图引用。然后,您将 viewholder class 的实例作为标记添加到带有 setTag()
的 convertView
中。在 if 语句的 else 部分,您只需使用 getTag()
从 convertView
获取视图持有者。不,您有 viewHolder,实际上可以用新数据更新列表视图项。
我希望这能解释你需要什么,如果没有的话,这里有一些指向更好资源的链接,然后是我的解释。
-这里是修改后的适配器,使用 viewholder 模式重用项目而不是每次滚动时都创建一个新项目,使滚动更加流畅。
/**
* Created by Ziad on 4/22/2015.
*/
public class Adapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return text1.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return text1[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewdHolder holder=null;
if (convertView == null) {
LayoutInflater infla=getActivity().getLayoutInflater();
View v = infla.inflate(R.layout.list_view_layout, null);
holder = new viewdHolder();
holder.tv1= (TextView) v.findViewById(R.id.textView1);
holder.iv1 = (ImageView) v.findViewById(R.id.imageView1);
holder.tv2 =(TextView) v.findViewById(R.id.textView2);
holder.iv2= (ImageView) v.findViewById(R.id.imageView2);
holder.tv3 = (TextView) v.findViewById(R.id.textView3);
holder.iv3 = (ImageView) v.findViewById(R.id.imageView3);
holder.tv4 = (TextView) v.findViewById(R.id.textView4);
holder.iv4 = (ImageView) v.findViewById(R.id.imageView4);
holder.tv5= (TextView) v.findViewById(R.id.textView5);
holder.iv5 = (ImageView) v.findViewById(R.id.imageView5);
holder.tv6 = (TextView) v.findViewById(R.id.textView6);
holder.iv6 = (ImageView) v.findViewById(R.id.imageView6);
holder.tv7 = (TextView) v.findViewById(R.id.textView7);
holder.iv7 = (ImageView) v.findViewById(R.id.imageView7);
convertView.setTag(holder);
}else{
holder = (ViewdHolder) convertView.getTag();
}
holder.tv1.setText(text1[position]);
holder.iv1.setImageResource(text2[position]);
holder.tv2.setText(text3[position]);
holder.iv2.setImageResource(text4[position]);
holder.tv3.setText(text5[position]);
holder.iv3.setImageResource(text6[position]);
holder.tv4.setText(text7[position]);
holder.iv4.setImageResource(text8[position]);
holder.tv5.setText(text9[position]);
holder.iv5.setImageResource(text10[position]);
holder.tv6.setText(text11[position]);
holder.iv6.setImageResource(text12[position]);
holder.tv7.setText(text13[position]);
holder.iv7.setImageResource(text14[position]);
if(text2[position]==R.drawable.ic_star){
holder.iv1.setVisibility(View.GONE);
}
if(text3[position].matches("")) {
holder.tv2.setVisibility(View.GONE);
}
if(text4[position]==R.drawable.ic_star){
holder.iv2.setVisibility(View.GONE);
}
if(text5[position].matches("")) {
holder.tv3.setVisibility(View.GONE);
}
if(text6[position]==R.drawable.ic_star){
holder.iv3.setVisibility(View.GONE);
}
if(text7[position].matches("")){
holder.tv4.setVisibility(View.GONE);
}
if(text8[position]==R.drawable.ic_star){
holder.iv4.setVisibility(View.GONE);
}
if(text9[position].matches("")){
holder.tv5.setVisibility(View.GONE);
}
if(text10[position]==R.drawable.ic_star){
holder.iv5.setVisibility(View.GONE);
}
if(text11[position].matches("")){
holder.tv6.setVisibility(View.GONE);
}
if(text12[position]==R.drawable.ic_star){
holder.iv6.setVisibility(View.GONE);
}
if(text13[position].matches("")){
holder.tv7.setVisibility(View.GONE);
}
if(text14[position]==R.drawable.ic_star){
holder.iv7.setVisibility(View.GONE);
}
return v;
}
class ViewdHolder {
TextView tv1;
ImageView iv1 ;
TextView tv2 ;
ImageView iv2;
TextView tv3 ;
ImageView iv3 ;
TextView tv4 ;
ImageView iv4 ;
TextView tv5 ;
ImageView iv5 ;
TextView tv6 ;
ImageView iv6 ;
TextView tv7 ;
ImageView iv7 ;
}
}
技巧:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if( convertView == null ){
convertView = LayoutInflater.from(getActivity()).inflate(R.layout.list_view_layout, null);
holder = new ViewHolder();
holder.tv=(TextView) convertView.findViewById(R.id.textView);
holder.iv=(ImageView) convertView.findViewById(R.id.imageView);
...
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.tv.setText(text1[position]);
holder.iv.setImageResource(text2[position]);
...
//handle with your widgets cached in ViewHolder
return convertView;
}
ViewHolder
在这里:
public class ViewHolder{
TextView tv;
ImageView iv;
}
我正在使用 ListView 列出文本和图像,但我想使用 ViewHolder 使滚动更流畅我已经尝试过但不太正确我必须如何修改代码
我试过的一些图片没有显示出来
@Override
public int getCount() {
return text1.length;
}
@Override
public Object getItem(int position) {
return text1[position];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater infla=getActivity().getLayoutInflater();
View v = infla.inflate(R.layout.list_view_layout, null);
TextView tv1 = (TextView) v.findViewById(R.id.textView1);
ImageView iv1 = (ImageView) v.findViewById(R.id.imageView1);
TextView tv2 = (TextView) v.findViewById(R.id.textView2);
ImageView iv2 = (ImageView) v.findViewById(R.id.imageView2);
TextView tv3 = (TextView) v.findViewById(R.id.textView3);
ImageView iv3 = (ImageView) v.findViewById(R.id.imageView3);
TextView tv4 = (TextView) v.findViewById(R.id.textView4);
ImageView iv4 = (ImageView) v.findViewById(R.id.imageView4);
TextView tv5 = (TextView) v.findViewById(R.id.textView5);
ImageView iv5 = (ImageView) v.findViewById(R.id.imageView5);
TextView tv6 = (TextView) v.findViewById(R.id.textView6);
ImageView iv6 = (ImageView) v.findViewById(R.id.imageView6);
TextView tv7 = (TextView) v.findViewById(R.id.textView7);
ImageView iv7 = (ImageView) v.findViewById(R.id.imageView7);
tv1.setText(text1[position]);
iv1.setImageResource(text2[position]);
tv2.setText(text3[position]);
iv2.setImageResource(text4[position]);
tv3.setText(text5[position]);
iv3.setImageResource(text6[position]);
tv4.setText(text7[position]);
iv4.setImageResource(text8[position]);
tv5.setText(text9[position]);
iv5.setImageResource(text10[position]);
tv6.setText(text11[position]);
iv6.setImageResource(text12[position]);
tv7.setText(text13[position]);
iv7.setImageResource(text14[position]);
if(text2[position]==R.drawable.ic_star){
iv1.setVisibility(View.GONE);
}if(text3[position].matches("")) {
tv2.setVisibility(View.GONE);
}if(text4[position]==R.drawable.ic_star){
iv2.setVisibility(View.GONE);
}if(text5[position].matches("")) {
tv3.setVisibility(View.GONE);
}if(text6[position]==R.drawable.ic_star){
iv3.setVisibility(View.GONE);
}if(text7[position].matches("")){
tv4.setVisibility(View.GONE);
}if(text8[position]==R.drawable.ic_star){
iv4.setVisibility(View.GONE);
}if(text9[position].matches("")){
tv5.setVisibility(View.GONE);
}if(text10[position]==R.drawable.ic_star){
iv5.setVisibility(View.GONE);
}if(text11[position].matches("")){
tv6.setVisibility(View.GONE);
}if(text12[position]==R.drawable.ic_star){
iv6.setVisibility(View.GONE);
}if(text13[position].matches("")){
tv7.setVisibility(View.GONE);
}if(text14[position]==R.drawable.ic_star){
iv7.setVisibility(View.GONE);
}
return v;
}
首先,您需要一个静态 ViewHolder Class 来保存您在适配器中的视图。
更像这个:
static class ViewHolder {
public TextView text;
public ImageView image;
}
并且该 viewholder 将用作视图的持有者,您在 getView
方法中初始化了它的视图并将其设置为标签,以便您稍后可以将其回收用于列表中的其他项目。
您可以按照this link应用listview的viewholder模式
您需要使用 getView()
中发送的 convertView
方法来优化工作。
阅读我的 blog 正确优化 ListView。
Viewholder 模式用于在容器中缓存列表项的视图 class 因此您不必为 [=] 中的每个列表项调用 inflate view 或 findViewById()
11=]。通过创建一个 class 可以保留对列表项中所有 ChildViews 的引用。通常这是内部静态 class.
getView()
方法中的View convertView,
参数是Android系统已经缓存的视图。因此,您从 if 语句开始,如果 convertView 为 null,则在其中扩充列表项。您还在那里的查看器上设置了所有子视图引用。然后,您将 viewholder class 的实例作为标记添加到带有 setTag()
的 convertView
中。在 if 语句的 else 部分,您只需使用 getTag()
从 convertView
获取视图持有者。不,您有 viewHolder,实际上可以用新数据更新列表视图项。
我希望这能解释你需要什么,如果没有的话,这里有一些指向更好资源的链接,然后是我的解释。
-这里是修改后的适配器,使用 viewholder 模式重用项目而不是每次滚动时都创建一个新项目,使滚动更加流畅。
/**
* Created by Ziad on 4/22/2015.
*/
public class Adapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return text1.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return text1[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewdHolder holder=null;
if (convertView == null) {
LayoutInflater infla=getActivity().getLayoutInflater();
View v = infla.inflate(R.layout.list_view_layout, null);
holder = new viewdHolder();
holder.tv1= (TextView) v.findViewById(R.id.textView1);
holder.iv1 = (ImageView) v.findViewById(R.id.imageView1);
holder.tv2 =(TextView) v.findViewById(R.id.textView2);
holder.iv2= (ImageView) v.findViewById(R.id.imageView2);
holder.tv3 = (TextView) v.findViewById(R.id.textView3);
holder.iv3 = (ImageView) v.findViewById(R.id.imageView3);
holder.tv4 = (TextView) v.findViewById(R.id.textView4);
holder.iv4 = (ImageView) v.findViewById(R.id.imageView4);
holder.tv5= (TextView) v.findViewById(R.id.textView5);
holder.iv5 = (ImageView) v.findViewById(R.id.imageView5);
holder.tv6 = (TextView) v.findViewById(R.id.textView6);
holder.iv6 = (ImageView) v.findViewById(R.id.imageView6);
holder.tv7 = (TextView) v.findViewById(R.id.textView7);
holder.iv7 = (ImageView) v.findViewById(R.id.imageView7);
convertView.setTag(holder);
}else{
holder = (ViewdHolder) convertView.getTag();
}
holder.tv1.setText(text1[position]);
holder.iv1.setImageResource(text2[position]);
holder.tv2.setText(text3[position]);
holder.iv2.setImageResource(text4[position]);
holder.tv3.setText(text5[position]);
holder.iv3.setImageResource(text6[position]);
holder.tv4.setText(text7[position]);
holder.iv4.setImageResource(text8[position]);
holder.tv5.setText(text9[position]);
holder.iv5.setImageResource(text10[position]);
holder.tv6.setText(text11[position]);
holder.iv6.setImageResource(text12[position]);
holder.tv7.setText(text13[position]);
holder.iv7.setImageResource(text14[position]);
if(text2[position]==R.drawable.ic_star){
holder.iv1.setVisibility(View.GONE);
}
if(text3[position].matches("")) {
holder.tv2.setVisibility(View.GONE);
}
if(text4[position]==R.drawable.ic_star){
holder.iv2.setVisibility(View.GONE);
}
if(text5[position].matches("")) {
holder.tv3.setVisibility(View.GONE);
}
if(text6[position]==R.drawable.ic_star){
holder.iv3.setVisibility(View.GONE);
}
if(text7[position].matches("")){
holder.tv4.setVisibility(View.GONE);
}
if(text8[position]==R.drawable.ic_star){
holder.iv4.setVisibility(View.GONE);
}
if(text9[position].matches("")){
holder.tv5.setVisibility(View.GONE);
}
if(text10[position]==R.drawable.ic_star){
holder.iv5.setVisibility(View.GONE);
}
if(text11[position].matches("")){
holder.tv6.setVisibility(View.GONE);
}
if(text12[position]==R.drawable.ic_star){
holder.iv6.setVisibility(View.GONE);
}
if(text13[position].matches("")){
holder.tv7.setVisibility(View.GONE);
}
if(text14[position]==R.drawable.ic_star){
holder.iv7.setVisibility(View.GONE);
}
return v;
}
class ViewdHolder {
TextView tv1;
ImageView iv1 ;
TextView tv2 ;
ImageView iv2;
TextView tv3 ;
ImageView iv3 ;
TextView tv4 ;
ImageView iv4 ;
TextView tv5 ;
ImageView iv5 ;
TextView tv6 ;
ImageView iv6 ;
TextView tv7 ;
ImageView iv7 ;
}
}
技巧:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if( convertView == null ){
convertView = LayoutInflater.from(getActivity()).inflate(R.layout.list_view_layout, null);
holder = new ViewHolder();
holder.tv=(TextView) convertView.findViewById(R.id.textView);
holder.iv=(ImageView) convertView.findViewById(R.id.imageView);
...
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.tv.setText(text1[position]);
holder.iv.setImageResource(text2[position]);
...
//handle with your widgets cached in ViewHolder
return convertView;
}
ViewHolder
在这里:
public class ViewHolder{
TextView tv;
ImageView iv;
}