Mamtaz Hussain
Mamtaz Hussain

Reputation: 1

Android ListView Items Overlap On Scroll Upward

Hi guys i am using a listView with LayoutInflater when i scroll the list view downward its ok but when i scroll it back to upward its start overlapping.

Actually once the the 1st row gets out of screen than the problem is occuring.

Here is Java Code

public class VehicleActivity extends Activity
{ 
 static ListView listView;
 public int context_menu_index;
 public void onCreate(Bundle savedInstanceState) 
 {
   //Some Code
   listView = (ListView) findViewById(R.id.list_view);
  listView.setAdapter(new EfficientAdapter(this));
 }

private class EfficientAdapter extends BaseAdapter
{
   private LayoutInflater mInflater;
   private TextView text1, text2, text3; 
   private View listItem;
   private ImageView  img_option;

   //Some Code
   public View getView(final int position, View convertView, ViewGroup parent) 
   {   
      if (convertView == null) 
      {
        mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         listItem = mInflater.inflate(R.layout.three_col_row, null);


        text1 = (TextView)  listItem.findViewById(R.id.imei);
        text2 = (TextView)  listItem.findViewById(R.id.status);
        text3 = (TextView)  listItem.findViewById(R.id.location);
        img_option = (ImageView) listItem.findViewById(R.id.img_arrow);

        img_option.setOnClickListener(new OnClickListener() 
        {
           @Override
           public void onClick(View v) 
           {
             VehicleActivity.this.registerForContextMenu(listView);                                           VehicleActivity.this.openContextMenu(listView);

              context_menu_index = position;
           }
       })
       img_option.setFocusable(true);
       img_option.setClickable(true);
       img_option.setTag(getItem(position));

       //Setting The Font Style
       text1.setTypeface(null, Typeface.BOLD);
       text2.setTypeface(null,  Typeface.ITALIC);  

       //Passing The Actual Values To TextViews
       text1.setText("ID: "       +VehicleList.IMEI[position]);
       text2.setText("Status: "   +VehicleList.Status[position]);
       text3.setText("Location: " +VehicleList.Location[position]);

       listItem.setBackgroundColor(position % 2 == 0 ? Color.parseColor("#eaeaea") : Color.parseColor("#d3e3f3"));
      } 

     return listItem;
 }

} }

Here is Activity Layout Which Have ListView

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:showAsAction="always"
  android:background="#0066FF" >

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusableInTouchMode="false"  
        android:cacheColorHint="#00000000"
        android:dividerHeight="1dp"
        android:scrollbars="none">
    </ListView>

 </LinearLayout>

Here is the layout i am passing to listView

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/layout_main"
  android:layout_height="wrap_content"
  android:layout_width="fill_parent"
  android:orientation="horizontal"
  android:padding="4dp">

   <LinearLayout
     android:id="@+id/child_lay1"    
     android:layout_height="wrap_content"
     android:layout_width="320dp"
     android:orientation="vertical"
     android:gravity="start">

            <TextView
            android:id="@+id/imei"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:layout_marginLeft="10dp"
            android:textSize="15sp"
            android:textStyle="bold"
            android:textColor="#000000"/>

            <TextView
            android:id="@+id/status"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:layout_marginLeft="10dp"
            android:textSize="15sp"
            android:textStyle="bold"
            android:textColor="#000000"/>

            <TextView
            android:id="@+id/location"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:layout_marginLeft="10dp"
            android:textSize="15sp"
            android:textColor="#000000"/>

    </LinearLayout>  <!-- Child Vertical Linear Layout -->

    <LinearLayout
    android:id="@+id/child_lay2"    
    android:layout_height="30dp"
    android:layout_width="30dp"
    android:orientation="vertical"
    android:gravity="end">

        <ImageView 
         android:id="@+id/img_arrow"
         android:src="@drawable/arrow"
         android:layout_width="30dp"
         android:layout_height="30dp"/>

   </LinearLayout> 

</LinearLayout>  

Upvotes: 0

Views: 790

Answers (2)

Bhuvnesh
Bhuvnesh

Reputation: 1055

Try with adding ViewHolder class in your EfficientAdapter and change your code like this:-

public class ViewHolder 
    {
         TextView text1;
         TextView text2;
         TextView text3;
         ImageView img_option;
    }

and

    public View getView(final int position, View convertView, ViewGroup parent) 
   {   ViewHolder holder;
      if (convertView == null) 
      {
        mInflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.three_col_row, null);

         holder = new ViewHolder();

         holder.text1 = (TextView)  convertView.findViewById(R.id.imei);
         holder.text2 = (TextView)  convertView.findViewById(R.id.status);
         holder.text3 = (TextView)  convertView.findViewById(R.id.location);
         holder.img_option = (ImageView) convertView.findViewById(R.id.img_arrow);
         convertView.setTag(holder);
        holder.img_option.setOnClickListener(new OnClickListener() 
        {
           @Override
           public void onClick(View v) 
           {
             VehicleActivity.this.registerForContextMenu(listView);                                           
             VehicleActivity.this.openContextMenu(listView);

             int context_menu_index = position;
           }
       });

      }  else {
            holder = (ViewHolder) convertView.getTag();
        }
      holder.img_option.setFocusable(true);
      holder.img_option.setClickable(true);
     holder.img_option.setTag(holder);

       //Setting The Font Style
      holder.text1.setTypeface(null, Typeface.BOLD);
      holder.text2.setTypeface(null,  Typeface.ITALIC);  

       //Passing The Actual Values To TextViews
      holder. text1.setText("ID: "       +VehicleList.IMEI[position]);
      holder.text2.setText("Status: "   +VehicleList.Status[position]);
      holder.text3.setText("Location: " +VehicleList.Location[position]);

      convertView.setBackgroundColor(position % 2 == 0 ? Color.parseColor("#eaeaea") : Color.parseColor("#d3e3f3"));

     return convertView;
 }

Upvotes: 1

App07
App07

Reputation: 115

I think the your adapter is not right, check with the suggested ones. try to use ViewHolder, so view can be reused.

public View getView(final int position, View convertView, ViewGroup parent) 
   { 
 ViewHolder vh;
if (convertView == null) {
            //inflate your view here.
            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }

        return convertView;
}

Upvotes: 0

Related Questions