List item repeating in android listview mood

In my custom items, the listviews are repeated. The item position is the same for the entire item. code below

ListAdapter.java -

public class ListAdapter extends BaseAdapter{ private List<String> mName; private List<Drawable> mIcon; private Context mContext; public ListAdapter(Context mContext, List<String> Name, List<Drawable> Icon) { this.mContext=mContext; this.mName=Name; this.mIcon=Icon; } @Override public int getCount() { // TODO Auto-generated method stub return mName.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View v, ViewGroup parent) { View mLayout; TextView mText; ImageView mImage; CheckBox mCheckBox; if(v==null){ LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mLayout=new View(mContext); mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null); mText=(TextView) mLayout.findViewById(R.id.Name); mImage=(ImageView) mLayout.findViewById(R.id.Icon); mCheckBox=(CheckBox) mLayout.findViewById(R.id.mCheckbox); mText.setText(mName.get(position)); mImage.setImageDrawable(mIcon.get(position)); mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton check, boolean isChecked) { if(check.isChecked()){ Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show(); } } }); } else{ mLayout=(View)v; } return mLayout; } } 
+6
source share
5 answers

try this, you need setTag() for each conversion.

  @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder mHolder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_menu, null); mHolder = new ViewHolder(); mHolder.mText=(TextView) convertView.findViewById(R.id.appName); mHolder.mImage=(ImageView) convertView.findViewById(R.id.appIcon); mHolder.mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox); convertView.setTag(mHolder); } else { mHolder = (ViewHolder) convertView.getTag(); } return convertView; } private class ViewHolder { private TextView mText; private ImageView mImage; private CheckBox mCheckBox; } 
+13
source

If you are using extends BaseAdapter then this solution will work. fooobar.com/questions/332691 / ...

+2
source

Change getView

  LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mLayout=new View(mContext); mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null); 

Initialize the inflatable element in your constructor. Delete this mLayout=new View(mContext) coz, which you mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null) layout with mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)

In your constructor

 LayoutInflater inflater; public ListAdapter(Context mContext, List<String> Name, List<Drawable> Icon) { this.inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.mContext=mContext; this.mName=Name; this.mIcon=Icon; } 

Use the View holder for smooth scrolling and performance.

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

 @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder vh; if(convertView==null){ vh = new ViewHolder(); convertView =(LinearLayout) inflater.inflate(R.layout.list_menu, null); vh.mText=(TextView) convertView.findViewById(R.id.Name); vh.mImage=(ImageView) convertView.findViewById(R.id.Icon); vh.mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox); convertView.setTag(vh); } else { vh = (ViewHolder) convertView.getTag(); } vh.mText.setText(mName.get(position)); vh.mImage.setImageDrawable(mIcon.get(position)); vh.mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton check, boolean isChecked) { if(check.isChecked()){ Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show(); } } }); return convertView; } static class ViewHolder { TextView mText; ImageView mImage; CheckBox mCheckBox; } 
+1
source
 // try this public class ListAdapter extends BaseAdapter { private List<String> mName; private List<Drawable> mIcon; private Context mContext; public ListAdapter(Context mContext, List<String> Name, List<Drawable> Icon) { this.mContext=mContext; this.mName=Name; this.mIcon=Icon; } @Override public int getCount() { // TODO Auto-generated method stub return mName.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View v, ViewGroup parent) { ViewHolder holder; if(v==null){ holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v =(LinearLayout) inflater.inflate(R.layout.list_menu, null); holder.mText=(TextView) v.findViewById(R.id.Name); holder.mImage=(ImageView) v.findViewById(R.id.Icon); holder.mCheckBox=(CheckBox) v.findViewById(R.id.mCheckbox); v.setTag(holder); } else{ holder = (ViewHolder) v.getTag(); } holder.mText.setText(mName.get(position)); holder.mImage.setImageDrawable(mIcon.get(position)); holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton check, boolean isChecked) { if(check.isChecked()){ Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show(); } } }); v.setTag(holder); return v; } class ViewHolder{ TextView mText; ImageView mImage; CheckBox mCheckBox; } } 
+1
source

Make sure convertView is not null. Therefore, put all the code after if (convertView == null) {}, which ensures that you have a convertView whose value is not null, by bloating out of context, if so.

 @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = LayoutInflater.from(context); convertView = inflater.inflate(R.layout.list_menu, parent, false); } TextView mText=(TextView) convertView.findViewById(R.id.appName); ImageView mImage=(ImageView) convertView.findViewById(R.id.appIcon); CheckBox mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox); mText.setText(mName.get(position)); mImage.setImageDrawable(mIcon.get(position)); return convertView; } 
0
source

Source: https://habr.com/ru/post/954651/


All Articles