2011-03-15 92 views
0

我正在创建一个Android应用程序,该应用程序在列表视图中显示电视节目。我的节目出现在ListView中,但它们切换一个卷轴。ListView在Android切换位置

他们创建为costum ListView和类是在这里:

public class CustomListViewAdapter extends BaseAdapter { 
    private static ArrayList<Show> searchArrayList; 
    private LayoutInflater mInflater; 
    private TextView txtTitle, txtPrev, txtNext; 

    public CustomListViewAdapter(Context context, ArrayList<Show> results) { 
     searchArrayList = results; 
     mInflater = LayoutInflater.from(context); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.custom_row, null); 
      txtTitle = (TextView) convertView.findViewById(R.id.title); 
      txtPrev = (TextView) convertView.findViewById(R.id.prevNrDate); 
      txtNext = (TextView) convertView.findViewById(R.id.nextNrDate); 
     } 

     txtTitle.setText(searchArrayList.get(position).getTitle()); 

     txtPrev.setText(searchArrayList.get(position).getPrevNr() + " - " + 
         searchArrayList.get(position).getPrevDate() + "\n" + 
         searchArrayList.get(position).getPrevTitle()); 

     txtNext.setText(searchArrayList.get(position).getNextNr() + " - " + 
         searchArrayList.get(position).getNextDate() + "\n" + 
         searchArrayList.get(position).getNextTitle()); 

     return convertView; 
    } 
} 

一些一谁可以帮忙吗?

//卡斯帕

回答

1

看起来您正试图实施ViewHolder以在使用循环视图时保存额外的findViewById调用。问题是,你正在存储每个适配器的视图,而不是每个循环视图。您需要创建一个单独的ViewHolder对象并将其与每个视图一起存储。视图的标签是做这件事的好地方。

试试这个:

public class CustomListViewAdapter extends BaseAdapter { 
    private static ArrayList<Show> mSearchArrayList; 
    private LayoutInflater mInflater; 

    public CustomListViewAdapter(Context context, ArrayList<Show> results) { 
     mSearchArrayList = results; 
     mInflater = LayoutInflater.from(context); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.custom_row, null); 
      holder = new ViewHolder(); 
      holder.title = (TextView) convertView.findViewById(R.id.title); 
      holder.prev = (TextView) convertView.findViewById(R.id.prevNrDate); 
      holder.next = (TextView) convertView.findViewById(R.id.nextNrDate); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final Show item = mSearchArrayList.get(position); 
     holder.title.setText(item.getTitle()); 

     holder.prev.setText(item.getPrevNr() + " - " + 
          item.getPrevDate() + "\n" + 
          item.getPrevTitle()); 

     holder.next.setText(item.getNextNr() + " - " + 
          item.getNextDate() + "\n" + 
          item.getNextTitle()); 

     return convertView; 
    } 

    private static class ViewHolder { 
     public TextView title; 
     public TextView prev; 
     public TextView next; 
    } 
} 
+0

非常感谢你,没有它工作:) – Casper 2011-03-15 20:01:31

0

移动

txtTitle = (TextView) convertView.findViewById(R.id.title); 
txtPrev = (TextView) convertView.findViewById(R.id.prevNrDate); 
txtNext = (TextView) convertView.findViewById(R.id.nextNrDate); 

if(convertView == null)块外。

视图被回收,但只有在创建视图时才设置它们。

+0

这工作,但不好的一面,以这种方法,你在执行每次查找遍历。将这些查找的结果存储起来以备后用,效率更高。 – adamp 2011-03-15 20:04:52

+0

@adamp哦,我同意。一定要使用ViewHolder模式。只是指出他发布的代码出了什么问题。 – 2011-03-15 20:09:31