Search code examples
androidandroid-layoutandroid-listviewhorizontalscrollviewcustom-adapter

CustomListView onItemClickListener not working while using HorizontalScrollView, Infinitely called getView() method


I am using the following code. Adapter.java class

public class Adapter extends ArrayAdapter<String> {
    private java.util.List<String> List;
    private Context context;
    public Adapter(List<String> list, Context ctx) {
        super(ctx, R.layout.row_item, list);
        this.List = list;
        this.context = ctx;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        NameHolder holder = new NameHolder();
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.row_item, null);
            TextView tv = (TextView)v.findViewById(R.id.textView1);
            LinearLayout ll = (LinearLayout) v.findViewById(R.id.myLayout);
            holder.topic_name = tv;
            holder.myLayout = ll;

            v.setTag(holder);
        }
        else
            holder = (NameHolder) v.getTag();
       String topic = List.get(position);
       holder.topic_name.setText(topic);    
       ImageView imgUsers = new ImageView(context);
       imgUsers.setImageResource(R.drawable.ic_launcher);
       holder.myLayout.addView(imgUsers);
       return v;
    }

    private static class NameHolder {
       public TextView topic_name;
       public LinearLayout myLayout;
    }
}

MainActivity.java class :

public class MainActivity extends Activity {
    ListView lv;
    ArrayList<String> list;
    Adapter myAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView)findViewById(R.id.listView1);
        list = new ArrayList<String>();
        for(int i=0; i<10;i++){
            list.add("Name"+i);
        }
        myAdapter = new Adapter(list, MainActivity.this);
        lv.setAdapter(myAdapter);
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this,"lets see"+list.get(arg2), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

row_item.xml :

<?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/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <HorizontalScrollView
        android:id="@+id/horizontalScrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    <LinearLayout 
        android:orientation="horizontal"
        android:id="@+id/myLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ></LinearLayout>
    </HorizontalScrollView>

</LinearLayout>

Now, the expected output is a single image in every listItem, which tend to go to infinite. And the onItemClickListener is not working as well. Also, onItemClickListener works if we don't add HorizontalScrollView. Writing onClickListener() in Adapter itself helps little as it works unpredictably. Also, on adding a print statement in getView() and observing in Logcat, I find it difficult to understand the pattern in which getView() is called. These are the problems I face. I require a working code of the things I wish to apply. Thanks in advance.


Solution

  • // Replace this code 
    public View getView(int position, View convertView, ViewGroup parent) {
            NameHolder holder;
            if (convertView == null) {
                holder = new NameHolder();
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.row_item, null);
                holder.topic_name = (TextView)convertView.findViewById(R.id.textView1);
                holder.myLayout = (LinearLayout) convertView.findViewById(R.id.myLayout);
    
                convertView.setTag(holder);
            }
            else
                holder = (NameHolder) convertView.getTag();
    
            String topic = List.get(position);
            holder.topic_name.setText(topic);
            ImageView imgUsers = new ImageView(context);
            imgUsers.setImageResource(R.drawable.ic_launcher);
            holder.myLayout.removeAllViews();
            holder.myLayout.addView(imgUsers);
            convertView.setTag(holder);
            return convertView;
        }