滚动 ListView 时,Spinner setSelection 数据将消失

Spinner setSelection data is going to vanish when scrolling ListView

嗨,我是 android 的新手,在我的 ListView 中,我添加了 Spinner。

我遇到问题,当我从微调器中选择任何项目并滚动我的 ListView 时。 微调器 setSelection 数据正在消失。

请帮我解决这个问题?

主要活动:-

public class MainActivity extends AppCompatActivity {

    private ArrayList<Friend> friendArrayList;

    String[] countriessArray =  { "USA", "USA", "USA", "USA",
            "China", "Japan", "France", "USA","USA", "USA", "USA", "USA",
            "China", "Japan", "France", "USA"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);

        friendArrayList = new ArrayList<Friend>();
        for (int i = 0; i < countriessArray.length; i++) {

            Friend item = new Friend(countriessArray[i]);
            friendArrayList.add(item);
        }

        ListView listView = (ListView) findViewById(R.id.list);

        ListViewAdapter adapter = new ListViewAdapter(this, R.layout.item_listview, friendArrayList);

        listView.setAdapter(adapter);
    }
}

ListViewAdapter:-

public class ListViewAdapter extends ArrayAdapter<Friend> implements AdapterView.OnItemSelectedListener {

    private List<Friend> myFriends;
    private Activity activity;
    private int selectedPosition = -1;

    public ListViewAdapter(Activity context, int resource, List<Friend> objects){

        super(context, resource, objects);
        this.activity = context;
        this.myFriends = objects;
    }

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

        ViewHolder holder;
        LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        // If holder not exist then locate all view from UI file.
        if (convertView == null) {
            // inflate UI from XML file
            convertView = inflater.inflate(R.layout.item_listview, parent, false);
            // get all UI view
            holder = new ViewHolder(convertView);
            // set tag for holder
            convertView.setTag(holder);
        } else {
            // if holder created, get tag from view
            holder = (ViewHolder) convertView.getTag();
        }

        holder.checkBox.setTag(position); // This line is important.
        holder.friendName.setText(getItem(position).getName());

        if (position == selectedPosition) {
            holder.checkBox.setChecked(true);
        } else holder.checkBox.setChecked(false);
        holder.checkBox.setOnClickListener(onStateChangedListener(holder.checkBox, position));

        // Spinner Drop down elements

        List<String> categories = new ArrayList<String>();
        categories.add("Automobile");
        categories.add("Business Services");
        categories.add("Computers");
        categories.add("Education");
        categories.add("Personal");
        categories.add("Travel");

        // Creating adapter for spinner
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(activity, android.R.layout.simple_spinner_item, categories);

        // Drop down layout style - list view with radio button
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        // attaching data adapter to spinner
        holder.spinner.setAdapter(dataAdapter);

        holder.spinner.setOnItemSelectedListener(this);

        return convertView;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // On selecting a spinner item
    }
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
    }

    private View.OnClickListener onStateChangedListener(final CheckBox checkBox, final int position) {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (checkBox.isChecked()) {
                    selectedPosition = position;
                } else {
                    selectedPosition = -1;
                }
                notifyDataSetChanged();
            }
        };
    }

    private static class ViewHolder {

        private TextView friendName;
        private CheckBox checkBox;
        private Spinner spinner;

        public ViewHolder(View v) {

            checkBox = (CheckBox) v.findViewById(R.id.check);
            friendName = (TextView) v.findViewById(R.id.name);
            spinner = (Spinner) v.findViewById(R.id.spinnerList);
        }
    }
}

朋友:-

public class Friend {

    private String name;

    public Friend(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

更好的方法是.. 在朋友的 Pojo class 中添加选择 属性。

喜欢: 整数选择= 0; 添加 getter setter.

然后在您的 OnItemsselected 中,将其值设置为微调器的选定位置。 在您的 getview 中,您需要添加条件并从其 getter 方法中获取值。

将您的 classes 更改为以下内容:

public class Friend {

    private String name;
    private int selection = 0;

    public Friend(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

   public void setSelection(int selection) {
        this.selection = selection;
    }

    public int getSelection() {
        return selection;
    }
}

并且在您的适配器视图中,

改变这个holder.spinner.setOnItemSelectedListener(这个); 为此:

holder.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                getItem(position).setselection(position);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });;

然后在监听器之后的 getView 中, 添加

try {
        holder.spinner.setSelection((getItem(viewpos)).getSelection(),false);
    } catch (Exception e) {

    }

这是正常的,因为每次滚动时都会调用 getView 来获取单元格的视图,并在其中重置微调项。

holder.spinner.setAdapter(数据适配器); 此行(以及初始化 dataAdapter 和设置点击侦听器的行)应放在 if (convertView == null) 块内(这是初始化单元格视图的地方)。

在 onSpinnerClick 方法中,您应该跟踪每个单元格的所选项目,并且在返回 convertView 之前,您应该设置 holder.spinner.setSelectedItem() 以便每个单元格的微调器将显示先前选择的项目