ListView getting displayed, but App crashes on Scrolling and clicking

377 Views Asked by At

I have a ListView with a custom layout named custom_listview.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:padding="5dp"
android:id="@+id/file_name"
/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="18dp"
    android:id="@+id/file_path"/>

</LinearLayout>

And this is my CustomAdapter class:

public class CustomAdapter extends BaseAdapter {

ArrayList<File> result;
Context context;

private static LayoutInflater inflater=null;
public CustomAdapter(Activity parentActivity, ArrayList<File> fileList) {
    // TODO Auto-generated constructor stub
    result=fileList;
    context=parentActivity;
   inflater = ( LayoutInflater )context.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return result.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;
}

public class Holder
{
    TextView file_name;
    TextView file_path;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub



    if (convertView == null)
    {
        LayoutInflater mInflater =   (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.custom_listview, null);
    }

    Holder holder=new Holder();
    holder.file_name=(TextView) convertView.findViewById(R.id.file_name);
    holder.file_path=(TextView) convertView.findViewById(R.id.file_path);
    //holder.img=(ImageView) rowView.findViewById(R.id.imageView1);
    holder.file_name.setText(result.get(position).getName());
    holder.file_path.setText(result.get(position).getPath());

    return convertView;
    }

    }

And here is my onClickListener for the ListView:

 public void onItemClick(AdapterView<?> parent, View view, int position,       long id) { 

    int color = Color.TRANSPARENT;
    Drawable background = parent.getChildAt(position).getBackground();
    if (background instanceof ColorDrawable)
        color = ((ColorDrawable) background).getColor();
  if(color == Color.CYAN)
  { parent.getChildAt(position).setBackgroundColor(Color.TRANSPARENT);}
    else {
      parent.getChildAt(position).setBackgroundColor(Color.CYAN);
      TextView t;
      t = (TextView) view.findViewById(R.id.file_path);
      files_selected.addElement(t.getText().toString());

      }
      }
      }

The app works fine when I click on any item on the top of the list. But as soon as I scroll down and click ANY item, the app crashes. Please Help. Thanks!

2

There are 2 best solutions below

8
On

You forgot else. Try this. If you are not implementing else part then while scrolling your app get collapsed.

Holder holder;

    if (convertView == null)
        {
     holder=new Holder();
            LayoutInflater mInflater =   (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.custom_listview, null);
     holder.file_name=(TextView) convertView.findViewById(R.id.file_name);
        holder.file_path=(TextView) convertView.findViewById(R.id.file_path);
    convertView.setTag(holder);
        }else{
    holder = (Holder) convertView.getTag();
    }

EDIT: If you are set if condition if (convertView == null) and forgot to set else part then the time of recycling (Scrolling) it will try to recreate and the text changes between rows, crash, etc. all are happen. So whenever you add if condition inside of getView you must add if as well as else.

0
On

Shouldnt it be;

if (convertView == null)
{
   LayoutInflater mInflater =   (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   convertView = mInflater.inflate(R.layout.custom_listview, null);

   Holder holder=new Holder();
   holder.file_name=(TextView) convertView.findViewById(R.id.file_name);
   holder.file_path=(TextView) convertView.findViewById(R.id.file_path);
   //holder.img=(ImageView) rowView.findViewById(R.id.imageView1);
   holder.file_name.setText(result.get(position).getName());
   holder.file_path.setText(result.get(position).getPath());
}else{ 
   viewHolder = (ViewHolder) view.getTag(); 
}       
view.setTag(viewHolder);