【问题标题】:Spinner setSelection data is going to vanish when scrolling ListView滚动 ListView 时微调器 setSelection 数据将消失
【发布时间】:2016-04-21 09:20:30
【问题描述】:

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

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

请帮助我如何解决这个问题?

MainActivity:-

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;
    }
}

【问题讨论】:

    标签: android listview android-spinner


    【解决方案1】:

    更好的方法是.. 在 Friend 的 Pojo 类中添加选择作为属性。

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

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

    将您的课程更改为以下:

    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(this); 对此:

    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) {
    
        }
    

    【讨论】:

    • 我是安卓新手,请提供代码解决方案
    • 你能提供我的解决方案吗?
    • if(getItem(position).getselection() != null) { holder.spinner.setSelection(getItem(position).setselection(position)); }
    • 请提供Logcat ..我已经手动编写了它,所以它可能有一些问题..提供logcat错误行..
    • 不不,当我在监听器之后将下面的代码粘贴到 getView 中时,我没有运行 if(getItem(position).getselection() != null) { holder.spinner.setSelection(getItem(position) .setselection(位置)); }
    【解决方案2】:

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

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

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

    【讨论】:

    • 我是 android 新手,请提供代码解决方案,我可以轻松做到这一点,请帮助我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多