自定义ListView - 重复条目

时间:2016-06-05 10:02:16

标签: android

主要活动

public class MainActivity extends AppCompatActivity {

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

    String[] answers = new String[]{"choice0","choice2","choice0","choice1","choice3","choice3"};
    Question[]  questions = new Question[6];
    for(int i=0; i<6; i++){
        questions[i] = new Question("Question"+(1+i),new String[]{"choice0","choice1","choice2","choice3"},answers[i]);
    }

    ListView listView = (ListView)findViewById(R.id.listQuestions);
    QuestionAdapter questionAdapter = new QuestionAdapter(this, R.layout.list_item_row_qs, questions);
    listView.setAdapter(questionAdapter);


   }
}

适配器

public class QuestionAdapter extends ArrayAdapter {

Context context;
Question[] questions;
View view;

public QuestionAdapter(Context context, int id, Question[] questions){
    super(context, id, questions);
    this.context = context;
    this.questions = questions;
}

private class ViewHolder{
    TextView chapName;
    RadioButton rb0;
    RadioButton rb1;
    RadioButton rb2;
    RadioButton rb3;
    Button button;
    RadioGroup rg;
    TextView hiddenAnswer;
}

@Override
public View getView(int pos, View row, ViewGroup parent){

    this.view = row;
    ViewHolder viewHolder = null;

    if(row == null) {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(R.layout.list_item_row_qs, null);
        viewHolder = new ViewHolder();
        viewHolder.chapName=(TextView) row.findViewById(R.id.question);
        viewHolder.rb0 = (RadioButton) row.findViewById(R.id.choice0);
        viewHolder.rb1 = (RadioButton) row.findViewById(R.id.choice1);
        viewHolder.rb2 = (RadioButton) row.findViewById(R.id.choice2);
        viewHolder.rb3 = (RadioButton) row.findViewById(R.id.choice3);
        viewHolder.button = (Button) row.findViewById(R.id.check);
        viewHolder.hiddenAnswer = (TextView) row.findViewById(R.id.answer);
        row.setTag(viewHolder);
    }
    else {
        viewHolder = (ViewHolder)row.getTag();
    }
    viewHolder.chapName.setText(questions[pos].getQuestionDescr());
    viewHolder.rb0.setText(questions[pos].getChoice()[0]);
    viewHolder.rb1.setText(questions[pos].getChoice()[1]);
    viewHolder.rb2.setText(questions[pos].getChoice()[2]);
    viewHolder.rb3.setText(questions[pos].getChoice()[3]);
    viewHolder.hiddenAnswer.setText(questions[pos].getAnswer());

    viewHolder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            View rowView = (ViewGroup) v.getParent();
            RadioGroup group = (RadioGroup) rowView.findViewById(R.id.rg);
            int selectedId = group.getCheckedRadioButtonId();
            if (selectedId == -1) {
                Toast.makeText(context, "Please choose the correct option", Toast.LENGTH_LONG).show();
            } else {
                RadioButton radioButton = (RadioButton) group.findViewById(selectedId);
                String answer = String.valueOf(((TextView) rowView.findViewById(R.id.answer)).getText());
                if (radioButton.getText().equals(answer)) {
                    Toast.makeText(context, "Correct Answer", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(context, "Wrong Answer", Toast.LENGTH_LONG).show();
                }

            }
        }
    });

    return row;
}

}

问题

列表中的第一项映射到第5项。第2项至第6项。我的意思是如果我更改第一个项目的单选按钮,也会在第5个列表项目中选择相同的单选按钮。

有什么建议吗?

是否因为回收?

我该如何解决?

我尝试保存在Question对象中并检索它。我使用pos来检索和设置。但同样的问题仍然存在。

1 个答案:

答案 0 :(得分:0)

适配器:

public class PersonAdapter extends BaseAdapter
{

    private static final int MIN_RECORDS_NUMBER = 11;

    private Context         _con;
    private List<Person>    _data;

    public PersonAdapter(Context context, List<Person> data)
    {
        _con = context;
        _data = data;
    }

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

    @Override
    public Person getItem(int position)
    {
        return _data.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        Holder h = null;
        if (convertView == null)
        {
            h = new Holder();
            convertView = LayoutInflater.from(_con).inflate(R.layout.item_layout, parent, false);

            h._backgroundItem = (LinearLayout) convertView.findViewById(R.id.item_layout);
            h._fName = (TextView) convertView.findViewById(R.id.f_name);
            h._lName = (TextView) convertView.findViewById(R.id.l_name);
            h._age = (TextView) convertView.findViewById(R.id.age);
            h._editBtn = (Button) convertView.findViewById(R.id.edit_btn);
            convertView.setTag(h);
        }
        else
        {
            h = (Holder) convertView.getTag();
        }

            final Person p = getItem(position);
            h._fName.setText(p._fName);
            h._lName.setText(p._lName);
            h._age.setText(String.valueOf(p._age));
            h._backgroundItem.setActivated(p._selected);
            h._editBtn.setOnClickListener(new OnClickListener()
            {

                @Override
                public void onClick(View v)
                {
                    ((MainActivity)_con).onEditClick(p._url);
                }
            });


        convertView.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                Person p = getItem(position);
                Intent i = new Intent(_con,SecondActivity.class);
                i.putExtra("DATA", p._fName);
                _con.startActivity(i);
            }
        });


        return convertView;

    }


    public void setData(List<Person> data)
    {
        _data = data;
        notifyDataSetChanged();

    }

    private static class Holder
    {
        public LinearLayout _backgroundItem;
        public TextView     _fName;
        public TextView     _lName;
        public TextView     _age;
        public Button       _editBtn;
    }

    public interface IDialog
    {
        public void onEditClick(String url);
    }


}

活动

public class MainActivity extends Activity implements IDialog
{

    private ListView        _listView;
    private PersonAdapter   _adapter;
    private Button          _sortBtn;
    private List<Person>    _data;
    private int             _sort;
    private int             _selectedItemIndex;
    private Bitmap          _bit;

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

        _listView = (ListView) findViewById(R.id.list);
        _sortBtn = (Button) findViewById(R.id.sort_list_btn);
        _selectedItemIndex = -1;
        _sort = 1;
        _data = new ArrayList<Person>();
        _data.add(new Person("http://i2.cdn.turner.com/cnnnext/dam/assets/160503230552-sanders-clinton-trump-triple-composite-mullery-medium-tease.jpg","abc", "defg", 1));
        _data.add(new Person("http://i2.cdn.turner.com/cnnnext/dam/assets/160503230552-sanders-clinton-trump-triple-composite-mullery-medium-tease.jpg","aaa", "defg", 12));
        _data.add(new Person("http://i2.cdn.turner.com/cnnnext/dam/assets/160503230552-sanders-clinton-trump-triple-composite-mullery-medium-tease.jpg","ccc", "defg", 13));
        _data.add(new Person("http://i2.cdn.turner.com/cnnnext/dam/assets/160511120611-bud-america-medium-tease.jpg","bb", "defg", 14));
        _data.add(new Person("http://i2.cdn.turner.com/cnnnext/dam/assets/160511120611-bud-america-medium-tease.jpg","aa", "defg", 144));
        _data.add(new Person("http://i2.cdn.turner.com/cnnnext/dam/assets/160511120611-bud-america-medium-tease.jpg","fff", "defg", 199));

//      _adapter = new PersonAdapter(this, _data);
//      _listView.setAdapter(_adapter);


        RedirectToMainActivityTask task = new RedirectToMainActivityTask();
        task.execute();

        _listView.setOnItemClickListener(new OnItemClickListener()
        {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                if(position<_data.size())
                {
                    if(_selectedItemIndex>-1)
                    {
                        _data.get(_selectedItemIndex)._selected = false;
                    }
                    _selectedItemIndex = position;

                    _data.get(position)._selected = true;
                    _adapter.setData(_data);
                }
            }
        });

        _sortBtn.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {


                if(_selectedItemIndex>-1)
                {
                    _listView.clearChoices();
                    String fName = _adapter.getItem(_selectedItemIndex)._fName;

                    Comparator<Person> sortById = Person.getComperatorByFirstName(_sort);
                    Collections.sort(_data, sortById);

                    int newSelectedItemIndex = getSelectedItemIndexByFName(fName);
                    _selectedItemIndex = newSelectedItemIndex;


                    _adapter.setData(_data);

                    if(newSelectedItemIndex>-1)
                    {
                        _listView.setItemChecked(newSelectedItemIndex, true);
                    }

                    _sort = -_sort;
                }
                else
                {
                    Comparator<Person> sortById = Person.getComperatorByFirstName(_sort);
                    Collections.sort(_data, sortById);

                    _adapter.setData(_data);
                    _sort = -_sort;
                }
            }


        });

    }

    private int getSelectedItemIndexByFName(String name)
    {
        for(int index=0;index<_data.size();index++)
        {
            if(_data.get(index)._fName.equals(name))
            {
                return index;
            }
        }
        return -1;
    }

    public static class Person
    {
        public String   _url;
        public String   _fName;
        public String   _lName;
        public int      _age;
        public boolean  _selected;

        public Person(String url,String fName, String lName, int age)
        {
            _url = url;
            _fName = fName;
            _lName = lName;
            _age = age;
        }

        public static Comparator<Person> getComperatorByFirstName(final int ascendingFlag)
        {
            return new Comparator<Person>()
            {
                @Override
                public int compare(Person patient1, Person patient2)
                {
                    return patient1._fName.compareTo(patient2._fName) * ascendingFlag;
                }
            };
        }

    }

    public Bitmap getBitmapFromURL(String src) {
        try
        {
            URL url = new URL(src);
            HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
            httpCon.setInstanceFollowRedirects(true);
            Bitmap image = BitmapFactory.decodeStream(httpCon.getInputStream());
            return image;
        }
        catch (MalformedURLException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }


    @Override
    public void onEditClick(final String url)
    {
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                _bit = getBitmapFromURL(url);
                runOnUiThread(new Runnable()
                {

                    @Override
                    public void run()
                    {


                         Dialog dialog = new Dialog(MainActivity.this);
                            dialog.setContentView(R.layout.custom_image);

                            ImageView image = (ImageView) dialog.findViewById(R.id.image);
                            if(_bit!=null)
                             {
                                 image.setImageBitmap(_bit);
                             }
                            dialog.setTitle("This is my custom dialog box");
                            dialog.setCancelable(true);
                            //there are a lot of settings, for dialog, check them all out!

                            dialog.show();
                    }
                });
            }
        }).start();



    }

    private class RedirectToMainActivityTask extends AsyncTask<Void, Void, Void>
    {
        protected Void doInBackground(Void... params)
        {
            try 
            {
                Thread.sleep( 2 * 1000 );
            }
            catch ( InterruptedException e )
            {
                e.printStackTrace();
            }
            return null;
        } 

        @Override
        protected void onPostExecute(Void result)
        {
              Intent intent = new Intent( getApplicationContext(), SecondActivity.class );
              intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
              startActivity( intent );
        }

    }

}

我正在保存人物对象内人物视图的状态