Bahu
Bahu

Reputation: 1596

Android: ListView not working properly after scroll

Hi I'm trying to show text, image alternatively in list view. To load the content into my list view i had three scenarios.

1. Some times i'm getting only the text from json. So, in this case i have to hide the ImageView

2. Some cases i'm getting only the image url from json. So, in this case i have to hide the TextView

3. In other case i'm getting both image url and text from json, so, in this case i don't have to hide anything

By following these scenarios i'm loading all the content correctly at first time but when i'm scrolling top to bottom and bottom to up. All the image views are filled with images (But there is no image url for that particular position)

My adapter code is

package com.app.listviewitemid.adapter;

import java.util.ArrayList;

import com.app.listviewitemid.R;
import com.app.listviewitemid.model.Items;
import com.bumptech.glide.Glide;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class ItemsAdapter extends ArrayAdapter<Items>{

    ArrayList<Items> itemsArrayList;
    int Resource; 
    LayoutInflater inflater;
    Context context;   
    ViewHolder holder;

    Button btnCheck;
    Items globPosition;

    public ItemsAdapter(Context context, int resource, ArrayList<Items> objects){
        super(context, resource, objects);
        this.context = context;
        this.Resource = resource;
        this.itemsArrayList = objects;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;
        if(v == null){
            v = inflater.inflate(Resource, null);
            holder = new ViewHolder();

            holder.tvPostID = (TextView) v.findViewById(R.id.tv_post_id);
            holder.tvPostText = (TextView) v.findViewById(R.id.tv_post_text);
            holder.ivPostImage = (ImageView) v.findViewById(R.id.iv_post_img);

            btnCheck = (Button) v.findViewById(R.id.btn_check);

            v.setTag(holder);

        }else{

            holder = (ViewHolder) v.getTag();
        }

        globPosition = itemsArrayList.get(position);

        holder.tvPostID.setText(itemsArrayList.get(position).getPostID());


        if(globPosition.getPostText().equals(null) || globPosition.getPostText().equals("")){

        }else {
            holder.tvPostText.setText(globPosition.getPostText());
        }



        if(globPosition.getPostImage().equals(null) || globPosition.getPostImage().equals("")){

        }else {
            Glide.with(context).load(globPosition.getPostImage()).placeholder(R.drawable.loading_img).error(R.drawable.bg_480_800).into(holder.ivPostImage);
        }




        btnCheck.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Log.e("PostID", globPosition.getPostID());

            }
        });

        return v;
    }

    static class ViewHolder{

        TextView tvPostID;
        TextView tvPostText;
        ImageView ivPostImage;

    }

}

adapter layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_post_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/post_id"
        android:textColor="#000000"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/tv_post_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:textSize="12sp" />

    <ImageView
        android:id="@+id/iv_post_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/empty" />

    <Button
        android:id="@+id/btn_check"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:background="#000000"
        android:text="@string/check"
        android:textColor="#FFFFFF" />

</LinearLayout>

How to get rid of this?

Upvotes: 0

Views: 709

Answers (2)

Bahu
Bahu

Reputation: 1596

I got the idea from ankit aggarwal answer (his code is not working properly but he gave me the basic idea). And one more thing, previously i didn't get the correct position, so i changed the adapter code little bit

Code

 package com.app.listviewitemid.adapter;

import java.util.List;

import com.app.listviewitemid.R;
import com.app.listviewitemid.model.Items;
import com.bumptech.glide.Glide;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class ItemsAdapter extends BaseAdapter{

    List<Items> itemsArrayList;
    int Resource; 
    LayoutInflater inflater;
    Context context;

    Button btnCheck;

    public ItemsAdapter(Context context, List<Items> items) {
        this.context = context;
        this.itemsArrayList = items;
    }

    @Override
    public int getCount() {
        return itemsArrayList.size();
    }

    @Override
    public Object getItem(int location) {
        return itemsArrayList.get(location);
    }

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

    @SuppressLint("InflateParams") @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (inflater == null)
            inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.adapter_layout, null);

            TextView tvPostID = (TextView) convertView.findViewById(R.id.tv_post_id);
            TextView tvPostText = (TextView) convertView.findViewById(R.id.tv_post_text);
            ImageView ivPostImage = (ImageView) convertView.findViewById(R.id.iv_post_img);

            btnCheck = (Button) convertView.findViewById(R.id.btn_check);

            final Items items = itemsArrayList.get(position);


            tvPostID.setText(items.getPostID());


            if(items.getPostText().equals(null) || items.getPostText().equals("")){
                tvPostText.setVisibility(View.GONE);
            }else {
                //ivPostImage.setVisibility(View.GONE);

                if(items.getPostImage().equals(null) || items.getPostImage().equals("")){
                    ivPostImage.setVisibility(View.GONE);
                }else {
                    ivPostImage.setVisibility(View.VISIBLE);
                    tvPostText.setVisibility(View.GONE);
                    Glide.with(context).load(items.getPostImage()).placeholder(R.drawable.loading_img).error(R.drawable.bg_480_800).into(ivPostImage);
                }

                tvPostText.setVisibility(View.VISIBLE);
                tvPostText.setText(items.getPostText());
            }



            if(items.getPostImage().equals(null) || items.getPostImage().equals("")){
                ivPostImage.setVisibility(View.GONE);
            }else {
                ivPostImage.setVisibility(View.VISIBLE);
                //tvPostText.setVisibility(View.GONE);

                if(items.getPostText().equals(null) || items.getPostText().equals("")){
                    tvPostText.setVisibility(View.GONE);
                }else {
                     tvPostText.setVisibility(View.VISIBLE);
                        tvPostText.setText(items.getPostText());
                }
                Glide.with(context).load(items.getPostImage()).placeholder(R.drawable.loading_img).error(R.drawable.bg_480_800).into(ivPostImage);
            }


            btnCheck.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {

                    Log.e("PostID", items.getPostID());

                }
            });

        return convertView;
    }

}

Thanks to ankit aggarwal

Upvotes: 0

Ankit Aggarwal
Ankit Aggarwal

Reputation: 5385

if(globPosition.getPostText().equals(null) || globPosition.getPostText().equals("")){
            holder.tvPostText.setVisibility(View.GONE);
        }else {
            holder.ivPostImage.setVisibility(View.GONE);
            holder.tvPostText.setVisibility(View.VISIBLE);
            holder.tvPostText.setText(globPosition.getPostText());
        }



        if(globPosition.getPostImage().equals(null) || globPosition.getPostImage().equals("")){
            holder.ivPostImage.setVisibility(View.GONE);
        }else {
            holder.ivPostImage.setVisibility(View.GONE);
            holder.tvPostText.setVisibility(View.VISIBLE);
            Glide.with(context).load(globPosition.getPostImage()).placeholder(R.drawable.loading_img).error(R.drawable.bg_480_800).into(holder.ivPostImage);
        }

Upvotes: 1

Related Questions