Java 进行选择时,列表视图列表会反转

Java 进行选择时,列表视图列表会反转,java,android,listview,reverse,Java,Android,Listview,Reverse,所以我的listview工作得很好,然后我决定添加一个上下文菜单。每当我在listview中单击一个项目时,只要我这样做,整个列表就会在第一次单击时反转。随后的单击对顺序没有任何影响,但当第一个项目再次取消选中时,列表将恢复正常。当我取出我添加的上下文菜单逻辑时,列表视图问题并没有消失 我附加了一个调试器,我的列表适配器中的元素永远不会重新排序,ListView本身也永远不会设置为与.setStackFromBottom相反 下面是我注册的onClick侦听器,用于处理列表视图项的单击事件: p

所以我的listview工作得很好,然后我决定添加一个上下文菜单。每当我在listview中单击一个项目时,只要我这样做,整个列表就会在第一次单击时反转。随后的单击对顺序没有任何影响,但当第一个项目再次取消选中时,列表将恢复正常。当我取出我添加的上下文菜单逻辑时,列表视图问题并没有消失

我附加了一个调试器,我的列表适配器中的元素永远不会重新排序,ListView本身也永远不会设置为与.setStackFromBottom相反

下面是我注册的onClick侦听器,用于处理列表视图项的单击事件:

public void onClick(View v) {  
    ViewHolder holder = (ViewHolder) v.getTag();  
    CheckBox b = holder.box;  
    Boolean check = b.isChecked();  
    b.setChecked(!check);  
    if (!check) {  
       mChecked.add(holder.fu);  
       if (mChecked.size() == 1) {  
         buttonLayout.setVisibility(View.VISIBLE);  
       }  
    } else {  
       mChecked.remove(holder.fu);  
       if (mChecked.size() == 0) {  
         buttonLayout.setVisibility(View.GONE);  
       }  
   }  
}
viewholder类只保存对listview中用于优化的对象的引用。我不明白为什么这会导致我的列表在显示时反转,我尝试将侦听器移动到布局中的其他视图,我尝试重新编写侦听器,但似乎没有任何效果!如有任何建议,将不胜感激

编辑:这是视图保持架的代码

/** Class to provide a holder for ListViews. Used for optimization */  
private class ViewHolder {  
    TextView date;  
    TextView gallons;  
    TextView cost;  
    TextView cpg;  
    TextView mpg;  
    CheckBox box;  
    FillUp fu;  
}  
以及适配器:

 public class FillUpAdapter extends BaseAdapter {

        ArrayList<FillUp> mElements;
        ArrayList<FillUp> mChecked;
        Context mContext;

        public FillUpAdapter(Context c, ArrayList<FillUp> data) {
            mContext = c;
            mElements = data;
            mChecked = new ArrayList<FillUp>();
        }

        public void clearChecked() {
            mChecked.clear();
        }

        public ArrayList<FillUp> getChecked() {
            return mChecked;
        }

        public boolean remove(FillUp f) {
            mChecked.remove(f);
            return mElements.remove(f);
        }

        @Override
        public int getCount() {
            return mElements.size();
        }

        @Override
        public Object getItem(int arg0) {
            return mElements.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {

            return mElements.get(arg0).getId();
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LinearLayout layout;
            ViewHolder holder;
            if (convertView != null) {
                layout = (LinearLayout) convertView;
                holder = (ViewHolder) layout.getTag();
            } else {
                layout = (LinearLayout) LayoutInflater.from(mContext).inflate(
                        R.layout.fillup_list_item, parent, false);
                holder = new ViewHolder();
                holder.cost = (TextView) layout
                        .findViewById(R.id.fillUpListTotalValue);
                holder.cpg = (TextView) layout
                        .findViewById(R.id.fillUpListCostPerGal);
                holder.gallons = (TextView) layout
                        .findViewById(R.id.fillUpListGalValue);
                holder.mpg = (TextView) layout
                        .findViewById(R.id.fillUpMPGText);
                holder.date = (TextView) layout
                        .findViewById(R.id.fillUpListDate);
                holder.box = (CheckBox) layout
                        .findViewById(R.id.fillUpListCheckBox);
                holder.fu = (FillUp) getItem(position);
                layout.setTag(holder);

            }

            holder.date.setText(holder.fu.getDate());
            holder.gallons.setText(holder.fu.getGallonsText());
            holder.cpg.setText(holder.fu.getCostText());
            holder.cost.setText(holder.fu.getTotalText());
            holder.mpg.setText(String.format("%03.1f MPG",holder.fu.getMPG()));
            if (convertView != null) {
                holder.box.setChecked(mChecked.contains(holder.fu));
            }

            layout.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    ViewHolder holder = (ViewHolder) v.getTag();
                    CheckBox b = holder.box;
                    Boolean check = b.isChecked();
                    b.setChecked(!check);
                    if (!check) {
                        mChecked.add(holder.fu);
                        if (mChecked.size() == 1) {
                            buttonLayout.setVisibility(View.VISIBLE);
                        }
                    } else {
                        mChecked.remove(holder.fu);
                        if (mChecked.size() == 0) {
                            buttonLayout.setVisibility(View.GONE);
                        }
                    }
                }
            });
            return layout;
        }
}
更新: 好的,我把它缩小到了buttonLayout视图上的可见性变化,这是活动布局底部的按钮的线性布局,在ListView下面。每当我将该视图的可见性更改为view.VISIBLE时(选中第一项时发生),列表的顺序将颠倒。当视图的可见性设置为view.GONE时,将恢复顺序


我不知道是什么原因导致了这种情况:

如果单击listview时背景颜色发生变化,我认为这与主题有关。只需使用listview的缓存颜色参数,以下是一个示例:

<ListView
            android:layout_width="fill_parent"
            android:id="@android:id/list"
            android:scrollingCache="true"
            android:persistentDrawingCache="all"
            android:cacheColorHint="#0000"
            android:layout_height="wrap_content"
            android:fastScrollEnabled="true"
            android:stackFromBottom="true"
            android:smoothScrollbar="true"
            android:paddingTop="115dip">
</ListView>

如果您单击listview时背景颜色发生变化,我认为这与您的主题有关。只需使用listview的缓存颜色参数,以下是一个示例:

<ListView
            android:layout_width="fill_parent"
            android:id="@android:id/list"
            android:scrollingCache="true"
            android:persistentDrawingCache="all"
            android:cacheColorHint="#0000"
            android:layout_height="wrap_content"
            android:fastScrollEnabled="true"
            android:stackFromBottom="true"
            android:smoothScrollbar="true"
            android:paddingTop="115dip">
</ListView>

在进一步缩小范围后,我发现问题不在于更改按钮栏的可见性,而在于传递ViewHolder类的holder.fu中的FillUp对象。通过将其更改为引用适配器的getItemposition方法,一切似乎都正常。这是一个相当奇怪的错误,因为适配器本身没有改变元素的顺序,但是传递对对象的引用使它非常不高兴。

在进一步缩小范围后,我发现问题不是我的按钮栏的可见性的改变,但实际上,在我的ViewHolder类的holder.fu中传递FillUp对象。通过将其更改为引用适配器的getItemposition方法,一切似乎都正常。这是一个很奇怪的错误,因为适配器本身没有更改元素的顺序,但是传递对对象的引用会使它非常不高兴。

可能是适配器中有什么东西,请检查代码是,类似症状的问题几乎总是表示适配器错误。向我们显示适配器的代码可能是适配器中的某些东西,请检查代码是的,类似症状的问题几乎总是表示适配器错误。向我们显示适配器的代码颜色不变,仅列表的顺序。颜色不变,仅列表的顺序不变。