列表视图在我向上和向下滚动时更改顺序?

时间:2016-06-02 20:17:36

标签: android android-adapter

这是适配器。如果我滚动到底部然后备份元素更改的顺序,则行为如标题中所述。我无法弄清楚为什么物品的顺序会发生变化。

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

class CustomAdapter extends BaseAdapter {

    private static final int TYPE_ITEM = 0;
    private static final int TYPE_SEPARATOR = 1;

    List<Map<String, String>> mData = new ArrayList<Map<String, String>>();
    private TreeSet<Integer> sectionHeader = new TreeSet<Integer>();

    private LayoutInflater mInflater;

    public CustomAdapter(Context context) {
        mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(final Map<String, String> item) {
        mData.add(item);
        notifyDataSetChanged();
    }

    public void addSectionHeaderItem(final Map<String, String> item) {
        mData.add(item);
        sectionHeader.add(mData.size() - 1);
        notifyDataSetChanged();
    }

    @Override
    public int getItemViewType(int position) {
        return sectionHeader.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

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

    @Override
    public String getItem(int position){
        return mData.get(position).get("id");
    }

    public String getItemMain(int position) {
       return mData.get(position).get("id");
   }

    public String getItemSecondary(int position) {
        return mData.get(position).get("description");
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        int rowType = getItemViewType(position);

        if (convertView == null) {
            holder = new ViewHolder();
            switch (rowType) {
                case TYPE_ITEM:
                    convertView = mInflater.inflate(R.layout.snippet_item1, null);
                    holder.textView = (TextView) convertView.findViewById(R.id.text);
                    holder.textView2 = (TextView) convertView.findViewById(R.id.text2);
                    holder.textView.setText(mData.get(position).get("id"));
                    holder.textView2.setText(mData.get(position).get("description"));
                    break;
                case TYPE_SEPARATOR:
                    convertView = mInflater.inflate(R.layout.snippet_item2, null);
                    holder.textView = (TextView) convertView.findViewById(R.id.textSeparator);
                    holder.textView.setText(mData.get(position).get("id"));
                    //holder.textView.setText(mData.get(position).get("description")); //no sub item yet!
                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        //holder.textView.setText(mData.get(position));


        return convertView;
    }

    public static class ViewHolder {
        public TextView textView;
        public TextView textView2;
    }

}

1 个答案:

答案 0 :(得分:0)

您以不完整的方式使用ViewHolder模式。如果currentView!= null,您仍然需要更新单元格信息(textviews),否则您将使用相同的循环视图,并加载旧信息。

所以:

if (currentView == null) {
    // this is ok
} else {
    holder = (ViewHolder) convertView.getTag();
    // this is the new stuff
    holder.textView.setText("blablabla");
}