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!
You forgot else. Try this. If you are not implementing else part then while scrolling your app get collapsed.
EDIT: If you are set if condition
if (convertView == null)
and forgot to set else part then the time ofrecycling
(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.