Member 11774649 Ответов: 1

Элементы Android listview перетасовываются при прокрутке сверху вниз?


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

public class CustomAdapter extends BaseAdapter
{
	LayoutInflater mInlfater;
	ArrayList<hashmap><string,string>> list;
	String rno="",name="";
	public CustomAdapter(Context context,ArrayList<hashmap><string,string>> list) 
	{
		mInlfater = LayoutInflater.from(context);
		this.list =list;
	}
	@Override
	public int getCount() 
	{
		return list.size();

	}

	@Override
	public Object getItem(int position) 
	{	
		return position;
	}

	@Override
	public long getItemId(int position)
	{	
		return position;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) 
	{
		final ViewHolder holder;
		if(convertView ==null)
		{
			convertView = mInlfater.inflate(R.layout.attendancelistview,null);
			holder = new ViewHolder();
			holder.b1 = (Button)convertView.findViewById(R.id.row3);
			holder.tv1 = (TextView)convertView.findViewById(R.id.row1);
			holder.tv2 = (TextView)convertView.findViewById(R.id.row2);
		   convertView.setTag(holder);
		}
		else
		{
			holder =(ViewHolder) convertView.getTag();
		}
		HashMap<string,string> map = list.get(position);
		holder.tv1.setText(map.get("Rno"));
		holder.tv2.setText(map.get("StudentName"));
		holder.b1.setOnClickListener(new OnClickListener()
		{

			@Override
			public void onClick(View v)
			{
				if(holder.b1.getText().equals("Present"))
				{
					holder.b1.setText("Absent");
					list.get(position).put("Attendance", "Absent");
					holder.b1.setTextColor(Color.RED);

				}
				else if(holder.b1.getText().equals("Absent"))
				{
					holder.b1.setText("Present");
					list.get(position).put("Attendance", "Present");
					holder.b1.setTextColor(Color.GREEN);

				}
				else
				{
					holder.b1.setText("Present");
					list.get(position).put("Attendance", "Present");
					holder.b1.setTextColor(Color.GREEN);
				}
				String rno1=  String.valueOf(holder.tv1.getText());
				name=String.valueOf(holder.tv2.getText());
			}

		});
		return convertView;
	}
	static class ViewHolder
	{
		Button b1;
		TextView tv1,tv2,tv3;
	}

}

1 Ответов

Рейтинг:
2

Member 10519668

Я бы посоветовал вам использовать recycler view вместо ListView
Recycler view поставляется с большим количеством украшений и методов, которые определенно помогут вам.
Посмотрите на страницу официальных документов
RecyclerView  |  Разработчики Android[^]

И есть известная проблема с видом recycler при прокрутке
Он перетасовывает элемент при прокрутке. Когда я был новичком, мне потребовалось несколько часов, чтобы найти его проблему.
Есть несколько решений для этого вы можете сделать если еще условия но это не рекомендуется вам нужно переопределить Recyclerview два метода
getItemId() и getITemViewType, и это решит вашу проблему
Ссылка на решение: При прокрутке Recyclerview перетасовывает или изменяет значения элемента списка | Духа решения[^]


Member 13971576

Большое спасибо, ты спас мне жизнь
Идеально работающее решение

taniyas

Спасибо Вам за такое замечательное решение. Что прекрасно работает на ListView, я трачу впустую всю свою неделю работы. Занимаясь google, я нашел это решение, которое экономит мое время.
Как реализовать в Xamarin Android взятое руководство
https://www.c-sharpcorner.com/article/xamarin-android-recyclerv/
Спасибо!