2016-06-05 6 views
0

Основная деятельностьПользовательские ListView - Повторяющиеся записи

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-й пункт. Второй предмет - шестой предмет. Я имею в виду, если я переключаю переключатель в первом элементе, тот же переключатель выбирается и в 5-м элементе списка.

Любые предложения?

Это из-за переработки?

Как его разрешить?

Я попытался сохранить объект Question и получить его. Я использовал pos для извлечения и установки. Но та же проблема все еще существует.

+0

вам нужно сохранить проверенные/непроверенные состояния кнопок внутри Объект вопроса –

+0

Нет. Если я выберу переключатель первого элемента, будет автоматически выбран переключатель 5-й позиции. Это моя проблема –

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

    } 

} 

Я спасаю состояние зрения человека внутри человека объекта

Смежные вопросы