2012-06-12 18 views
0

我为我的ListView定制了ArrayAdapter,它会改变点击的行的资源视图(模拟点击它时扩展的行)。使用OnItemClickListener我观察点击并将点击位置设置为适配器。然后我告诉适配器数据改变了。然后适配器进行更新,并在点击位置使用一个简单的if语句来使用不同的资源视图。发生最后一次点击的视图返回到其初始“未展开”状态。如果我只是让适配器从头开始充气每个视图,这工作正常。这里是我的MyAdapter类我用这个代码:基于使用的资源视图回收ListView行吗?

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View row; 
    LayoutInflater inf = ((Activity) mContext).getLayoutInflater(); 

    if(clickposition == position){ 
     row = inf.inflate(R.layout.expandedoverviewrow, parent, false); 
    } 
    else{ 
     row = inf.inflate(R.layout.overviewrow, parent, false); 
    } 

    TextView txtPayedby = (TextView)row.findViewById(payedbyId); 
    TextView txtAmount = (TextView)row.findViewById(amountId); 
    TextView txtDate = (TextView)row.findViewById(dateId); 
    TextView txtDescript = (TextView)row.findViewById(descriptId); 
    TextView txtPersons = (TextView)row.findViewById(personId); 

    txtPayedby.setText(payedbyList.get(position)); 
    txtAmount.setText(amountList.get(position)); 
    txtDate.setText(dateList.get(position)); 
    txtDescript.setText(descriptList.get(position)); 
    txtPersons.setText(personList.get(position)); 

    return(row); 
} 

public void clicked(int position){ 
    clickposition = position; 
} 

如果我想不过回收的意见,这是怎么回事都错了。随机行获取“展开”视图,因为它正在回收视图。如果我使用上面的代码,这是预期的。如果convertView是普通视图或“扩展”视图,我试图稍微更改代码来区分。我这样做是通过改变代码的第一部分:

View row = convertView; 
    if{row == null || ......){ 
     LayoutInflater inf = ((Activity) mContext).getLayoutInflater(); 
     row = inf.inflate(R.layout.overviewrow, parent, false); 
    } 
    if(clickedposition == position){ 
     LayoutInflater inf = ((Activity) mContext).getLayoutInflater(); 
     row = inf.inflate(R.layout.expandedoverviewrow, parent, false); 
    } 

在第一多点if语句我想检查如果视图是“扩张”的说法。我尝试了各种各样的东西,比较getId和Resource Id,并将内容描述与字符串进行比较。将convertView与将使用inflater创建的视图进行比较。所有未能检测到视图是正常还是“扩展”视图。导致该操作系统正在回收视图,从而使越来越多的“扩大”视图作为行。

有没有人知道一种方法,将工作来检测不同的意见?或者在这种情况下更好地回收视图?

+0

为什么不只是使用'ExpandableListView'和'ExpandableListAdapter'?可能比试图写自己的更容易。 – edthethird

+0

我不想像展示更多信息或选项那样“展开”,就像使用ExpandableListView和-Adapter一样。当你点击它时,我实际上想要将整行替换为另一行。当你点击其他行时,替换该行并恢复前一行。这是工作,如果我不回收视图,我试图找到一种方法来让这个工作,而我回收优化我的应用程序。 – Dave992

+0

我知道这个问题很老,但我想知道你是否曾经找到过解决方案?我现在正在为类似的问题苦苦挣扎。 – bkaiser

回答

1

......还是在这种情况下更好地回收视图?

总是使用的ListView的回收机制,下面是我会怎么做(你的逻辑实现的getView方法有点怪)。首先我会使用适配器的getItemViewTypegetViewTypeCount方法。他们是这样的:

@Override 
public int getItemViewType(int position) { 
    if (clickposition != -1 && position == clickposition) { 
     return SPECIAL_VIEW; 
    } 
    return NORMAL_VIEW; 
} 

@Override 
public int getViewTypeCount() { 
    return 2; // we have two types of views 
} 

其中NORMAL_VIEWSPECIAL_VIEW是两种类型的行(在正常的和扩展的一种):

// fields in your adapter class 
public static final int NORMAL_VIEW = 0; 
public static final int SPECIAL_VIEW = 1; 

的使用上面的所有代码,该getView方法是这样的:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    int whichOne = getItemViewType(position); 
    if (convertView == null) { 
     switch (whichOne) { 
     case NORMAL_VIEW: 
      convertView = mInflater.inflate(R.layout.overviewrow, parent, false); 
      break; 
     case SPECIAL_VIEW: 
      convertView = mInflater.inflate(R.layout.expandedoverviewrow, parent, false); 
      break; 
      } 
    } else { 
     // there is no else, the getItemViewType will make sure that you have a valid view      
    } 
    // then you would set the data based on the value of whichOne 
    //... 

当您单击某个项目更新clickposition,也叫notifyDataSetChanged上适配器,以便它可以调整行。