Список дублирует элемент каждые 6 раз

Надеюсь, все хорошо;

Я знаю, что эта проблема рассматривалась ранее пару раз, но после долгих поисков я так и не нашел решения.

Мой пользовательский список дублирует элементы каждые 6 элементов.

Уже проверено и опробовано:

1- layout_width и layout_height не содержат wrap_content

2-holder = new ListViewItem() перед любой инициализацией содержимого

3- Существует "convertView != null"

4-holder.linearLayout.getChild() нельзя использовать в моем случае, потому что макет не является линейным

5- очистить()

Если кто-нибудь может мне помочь, это мои коды

getView() из CustomListViewAdapter.java

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

    ListViewItem item = items.get(position);
    ListViewItem holder;


    View vi=convertView;

    inflater = (LayoutInflater)    getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);



    if(vi==null){

        vi = inflater.inflate(R.layout.item, null);
        holder = new ListViewItem();
        holder.cb = (CheckBox) vi.findViewById(R.id.Item1);
        holder.sp = (Spinner) vi.findViewById(R.id.Item2);
        holder.title = (TextView) vi.findViewById(R.id.Item3);
        holder.pricetitle= (TextView) vi.findViewById(R.id.item4);
        holder.Descriptiontitle= (TextView) vi.findViewById(R.id.Item5);
        vi.setTag(holder);

    }else{
        holder = (ListViewItem) vi.getTag();
    }



    holder.title.setText(item.ItemTitle);
    holder.pricetitle.setText(item.price+"");
    holder.Descriptiontitle.setText(item.Description);

    return vi;  
}

Класс ListViewItem

static class ListViewItem{
    public String ItemTitle;
    public int price;
    public String Description;
    public TextView title;
    public TextView pricetitle;
    public TextView Descriptiontitle;
    public CheckBox cb;
    public Spinner sp;
}

Основная деятельность

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

    View v = inflater.inflate(R.layout.starterbottom, null);

    ListView myList = (ListView)v.findViewById(R.id.MyListStarter);

    List<ListViewItem> items = new ArrayList<ListViewItem>();

    for(int i=0;i<10;i++){

        items.add(new ListViewItem(){{
            ItemTitle = "Starter Title";
            Description= "Your description goes here";
            price=0;
        }});

    }

    CustomListViewAdapter listadapter = new CustomListViewAdapter(getActivity(), android.R.layout.simple_list_item_1, items);

    myList.setAdapter(listadapter);

    return v;
}

ИЗМЕНИТЬ

MainmenuActivity.java

public class MainmenuActivity extends SlidingActivity{


Button buttononside;
TextView title;
FragmentAdapter mAdapter;
ViewPager mPager;
PageIndicator mIndicator;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_mainmenu);
    setBehindContentView(R.layout.sidemenu);

    mAdapter = new FragmentAdapter(getSupportFragmentManager());
    mPager = (ViewPager)findViewById(R.id.pager);

    mPager.setAdapter(mAdapter);
    mPager.setOffscreenPageLimit(4);
    mIndicator = (PageIndicator)findViewById(R.id.indicator);
    mIndicator.setViewPager(mPager);

    getSlidingMenu().setBehindOffset(200);
    getSlidingMenu().setMode(SlidingMenu.RIGHT);
    getSlidingMenu().setFadeDegree(0.35f);

    title = (TextView) findViewById(R.id.Title);
    title.setText("Starters");




}


public boolean onCreateOptionsMenu(android.view.Menu menu) {
    getMenuInflater().inflate(R.menu.mainmenu, menu);
    return true;
}


public void onClick(View v) {
    getSlidingMenu().toggle();

}

public void changecolor(View v){
    buttononside = (Button) findViewById(v.getId());


    buttononside.setOnTouchListener(new OnTouchListener(){

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction()==MotionEvent.ACTION_DOWN)
                buttononside.setBackgroundColor(Color.BLACK); 
            else
                buttononside.setBackgroundResource(R.drawable.buttonshape);
            return true;
        }

    });
}


static class ListViewItem{
    public String ItemTitle;
    public int price;
    public String Description;
    public TextView title;
    public TextView pricetitle;
    public TextView Descriptiontitle;
    public CheckBox cb;
    public Spinner sp;
}

}

Фрагментадаптер.java

public class FragmentAdapter extends FragmentPagerAdapter implements IconPagerAdapter{

  public FragmentAdapter(FragmentManager fm) {
        super(fm);
    }

@Override
public int getIconResId(int index) {
    return 0;
}

@Override
public Fragment getItem(int position) 
{
    android.support.v4.app.Fragment fragment = new StarterActivity();
    switch(position){
    case 0:
        fragment = new MainActivity();
        break;
    case 1:
        fragment = new SecondActivity();
        break;
    case 2:
        fragment = new ThirdActivity();
        break;
    case 3:
        fragment = new FourthActivity();
        break;
    }
    return fragment;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 4;
}

@Override
public CharSequence getPageTitle(int position){
    String title = "";
    switch(position){
    case 0:
        title = "First";
        break;
    case 1:
        title = "Second";
        break;
    case 2:
        title = "Third";
        break;
    case 3:
        title = "Fourth";
        break;
    }
    return title;
 }
}

MainActivity.java

public class MainActivity extends Fragment {


int i=0;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

    View v = inflater.inflate(R.layout.starterbottom, null);

    ListView myList = (ListView)v.findViewById(R.id.MyListStarter);

    List<ListViewItem> items = new ArrayList<ListViewItem>();

    for(i=0;i<10;i++){

        items.add(new ListViewItem(){{
            ItemTitle = "Title "+i;
            Description= i+" Your Own description";
            price= i;
        }});

    }

    CustomListViewAdapter listadapter = new CustomListViewAdapter(getActivity(), R.layout.item, items);

    myList.setAdapter(listadapter);

    return v;

    }
 }

Заранее спасибо, С уважением, Крис


person Odin    schedule 22.07.2013    source источник
comment
Listview duplicates item every 6 times - Что это значит? В for-loop внутри вашего onCreateView() измените price=0; на price=i;. Элементы все еще дублируются?   -  person Vikram    schedule 23.07.2013
comment
Похоже, что в вашем коде отсутствует что-то, что затрудняет диагностику проблемы. Из того, что вы включили, нет ничего вопиюще очевидного. Я бы попробовал изменить ListViewItem item = items.get(position); на ListViewItem item = getItem(position), предполагая, что вы по ошибке поставили CustomListView.java вместо CustomListViewAdapter.java   -  person Chris Feist    schedule 23.07.2013
comment
И почему макет android.R.layout.simple_list_item_1 в конструкторе вашего адаптера? Вы надуваете, меняете и возвращаете пользовательский в своем getView().   -  person Vikram    schedule 23.07.2013
comment
Единственная проблема, которую я вижу в getView, заключается в том, что вы забыли сбросить значения некоторых дочерних элементов в держателе, что может привести к этому, например: если один элемент ДЕЙСТВИТЕЛЬНО ИМЕЕТ цену правильно отображать его, но если другой элемент НЕ имеет цене, этот текст будет заполнен одним из повторно используемых представлений...   -  person Martin Cazares    schedule 23.07.2013
comment
Прежде всего, спасибо за ваши быстрые ответы, я действительно ценю это .. @vikram, если я установлю цену = i; Я получаю правильный порядок от 0 до 9 .. но если я проверил CheckBox в позиции 0, он будет автоматически проверен и в позиции 6 .. Я не уловил simple_list_item_1 , я правильно изменил его на R.layout.item но это еще не решило мою проблему.   -  person Odin    schedule 23.07.2013
comment
@Chris, да, извините, это CustomListViewAdapter.java .. уже пытался манипулировать getItem (position), но безуспешно .. спасибо, ответ   -  person Odin    schedule 23.07.2013
comment
@Martin, спасибо, что указали мне на это, но пока я просто пробую приложение .. позже я свяжу его и получу цены из базы данных, поэтому у меня больше не будет этой проблемы.   -  person Odin    schedule 23.07.2013
comment
Крис, можешь опубликовать код, когда определяешь поведение для CheckBox? А еще лучше опубликуйте весь MainActivity.   -  person Vikram    schedule 23.07.2013
comment
Ну, это довольно сложно, потому что я также использую скользящее меню, viewpagerindicator и фрагментный адаптер. Я отредактирую и опубликую действие mainmenu, которое загружает скользящее меню и фрагментный адаптер, который устанавливает фрагменты ViewPagerIndicator :)   -  person Odin    schedule 23.07.2013
comment
Если щелчок по одному CheckBox влияет на два из них, было бы полезно опубликовать код, где вы их настроили, установили их OnClickListeners и т. д.   -  person Vikram    schedule 23.07.2013
comment
@vikram ummm, я еще не реализовал OnClickListener ... но проблема также присутствует со Spinner ... поэтому я не думаю, что это проблема слушателя ...   -  person Odin    schedule 23.07.2013
comment
@vikram Я попытался добавитьholder.cb.setChecked(false); к getView () ... позиция 6 больше не проверяется, но при прокрутке позиции 0 также не проверяется. Я думаю, использование saveInstanceState решит мою проблему? Любые идеи?   -  person Odin    schedule 23.07.2013
comment
Я объясню проблему. Но можно попробовать код из моего поста ниже? Если получится, можем обсудить этот вопрос.   -  person Vikram    schedule 23.07.2013
comment
Если вы используете расширения BaseAdapter, это решение будет работать. http://stackoverflow.com/a/28791031/4531507   -  person Rahul Sharma    schedule 22.08.2016


Ответы (1)


Я вижу проблему сейчас. И нет, здесь нет дублирования. Выполните эти несколько изменений:

В вашем статическом классе ListViewItem добавьте boolean isChecked;

static class ListViewItem{
    public String ItemTitle;
    public int price;
    public String Description;
    public TextView title;
    public TextView pricetitle;
    public TextView Descriptiontitle;
    public CheckBox cb;
    public Spinner sp;
    public boolean isChecked;    // <--- added
}

Измените инициализацию items:

items.add(new ListViewItem(){{
        ItemTitle = "Starter Title";
        Description= "Your description goes here";
        price=i;
        isChecked = false;
    }});

В методе getView() после holder.Descriptiontitle.setText(item.Description); добавьте:

holder.cb.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    if (((CheckBox) v).isChecked()) {
                item.isChecked = true;
    } else {
                item.isChecked = false;
            } 
  }
});


if (item.isChecked) {
    holder.cb.setChecked(true);
} else {
    holder.cb.setChecked(false);
}

Добавьте ключевое слово final к ListViewItem item = items.get(position);:

final ListViewItem item = items.get(position);
person Vikram    schedule 23.07.2013
comment
Вау, большое спасибо @vikram за то, что нашли время, чтобы помочь мне, наконец-то это сработало :) Я очень благодарен !! Я понял, что мне нужно было инициализировать, если флажок установлен или нет ... но почему слушатель решил мою проблему, если ничего не влияет на другие флажки? - person Odin; 23.07.2013
comment
У меня сейчас проблема со Spinner.. после прокрутки значения перепутались.. Я использую setOnItemSelectedListener, если у кого-нибудь есть идея, в чем может быть проблема - person Odin; 23.07.2013
comment
@Chris Используйте аналогичный подход (тот, который вы использовали для решения проблемы с CheckBox). Создайте целочисленную переменную в ListViewItem, например int spinnerValue. Добавьте прослушиватель `setOnItemSelectedListener (AdapterView.OnItemSelectedListener)` для экземпляров Spinner в вашем getView(). Когда значения выбираются из этого счетчика, будет вызываться метод onItemSelected(AdapterView<?> parent, View view, int position, long id). Сохраните position в spinnerValue файла ListViewItem. - person Vikram; 23.07.2013
comment
@Chris В вашем getView() добавьте строку кода: holder.sp.setSelection(item.spinnerValue). Не забудьте инициализировать эти значения в цикле for в MainActivity: spinnerValue = 0. - person Vikram; 23.07.2013
comment
чувак, я не знаю, как тебя отблагодарить .. Я делал, как ты упомянул, но использовал setOnItemClickListener вместо setOnItemSelectedListener, хотя я знаю, что мне нужно использовать первый, лол .. Теперь все работает отлично .. спасибо за лучшее много :) - person Odin; 24.07.2013