Error in AdapterView.OnItemClickListener

Why do I say mis here this array list Code I tried a lot I did not find the solution Please Help

*public class* MainActivity extends AppCompatActivity {

**@Override**
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ArrayList<Listitem> Items = new ArrayList<Listitem>();
    Items.add(new Listitem("Noor", "Derna"));
    Items.add(new Listitem("MERO", "Derna"));
    Items.add(new Listitem("Noor", "Derna"));
    Items.add(new Listitem("Noor", "Derna"));

    **mycustomadapter myadabter = new mycustomadapter(Items);**

    **ListView Ls = (ListView) findViewById(R.id.listView); 
    Ls.setAdapter(myadabter);
Ls.setOnClickListener(new AdapterView.OnItemClickListener() {**


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

            TextView txtname = (TextView) view.findViewById(R.id.txt_name);
            TextView txtdisc = (TextView) view.findViewById(R.id.txt_disc);
            Toast.makeText(getApplicationContext(), txtname.getText(), Toast.LENGTH_LONG).show();
        }
    });
}





class  mycustomadapter extends BaseAdapter
{
    ArrayList<Listitem> Items=new ArrayList<Listitem>(); array list
    mycustomadapter(ArrayList<Listitem> Items){
    this.Items=Items;
    }
    @Override
    public int getCount() {
        return Items.size();
    }

    @Override
    public Object getItem(int position) {
        return Items.get(position).Name;
    }

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

    @Override
    public View getView(int i, View View, ViewGroup viewGroup) {
        LayoutInflater Linflater=getLayoutInflater(); 
        View view1 = Linflater.inflate(R.layout.raw_view,null); الview1يمثل الraw_item
        TextView txtname=(TextView)view1.findViewById(R.id.txt_name);
        TextView txtdisc=(TextView)view1.findViewById(R.id.txt_disc);
        txtname.setText(Items.get(i).Name);
        txtdisc.setText(Items.get(i).Desc);

        array list
        return view1;


    }
}

}` ListView Ls = (ListView) findViewById(R.id.listView); //اتصال بالليست فيو Ls.setAdapter(myadabter); Ls.setOnClickListener(new AdapterView.OnItemClickListener() {

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

            TextView txtname = (TextView) view.findViewById(R.id.txt_name);
            TextView txtdisc = (TextView) view.findViewById(R.id.txt_disc);
            Toast.makeText(getApplicationContext(), txtname.getText(), Toast.LENGTH_LONG).show();
        }
    });
}`

Upvotes: 1

Views: 1895

Answers (2)

jeel raja
jeel raja

Reputation: 667

For making array-list final, because you have declared it inside onCreate(), and while using it inside onItemClick listener you have to make it final.

If you don't want to make it final, you can declare array-list as a global , and you initialize it inside onCreate(), then you do not need to make it final.

And yes, you can remove final from adapter initialization.It will not affect to code.

Upvotes: 0

jeel raja
jeel raja

Reputation: 667

Why are you taking On-clickListner in Listview??..whatever you are doing is this...

Ls.setOnClickListener(new AdapterView.OnItemClickListener() {

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

            TextView txtname = (TextView) view.findViewById(R.id.txt_name);
            TextView txtdisc = (TextView) view.findViewById(R.id.txt_disc);
            Toast.makeText(getApplicationContext(), txtname.getText(), Toast.LENGTH_LONG).show();
        }
    });
}`

This is completely wrong..if you want to make click of listview item and get text from item on which you have clicked then do like this,

 Ls.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {

                Toast.makeText(MainActivity.this, Items.get(position).getName() + " " + Items.get(position).getDesc(), Toast.LENGTH_SHORT).show();

            }
        });

To clear your confusion here is complete code,

public class MainActivity extends AppCompatActivity {

    ListView Ls;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Ls = (ListView) findViewById(R.id.listView);


        final ArrayList<Listitem> Items = new ArrayList<Listitem>();
        Items.add(new Listitem("Noor", "Derna"));
        Items.add(new Listitem("MERO", "Derna"));
        Items.add(new Listitem("Noor", "Derna"));
        Items.add(new Listitem("Noor", "Derna"));

        final mycustomadapter myadabter = new mycustomadapter(Items);
        Ls.setAdapter(myadabter);

        Ls.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {

                Toast.makeText(MainActivity.this, Items.get(position).getName() + " " + Items.get(position).getDesc(), Toast.LENGTH_SHORT).show();

            }
        });

    }

    class mycustomadapter extends BaseAdapter {
        ArrayList<Listitem> Items = new ArrayList<Listitem>();
        public TextView txtname, txtdisc;
        LayoutInflater Linflater;

        mycustomadapter(ArrayList<Listitem> Items) {
            this.Items = Items;
        }

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

        @Override
        public Object getItem(int position) {
            return Items.get(position).name;
        }

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

        @Override
        public View getView(int i, View View, ViewGroup viewGroup) {
            Linflater = getLayoutInflater();
            View view1 = Linflater.inflate(R.layout.raw_view, null);
            txtname = (TextView) view1.findViewById(R.id.txt_name);
            txtdisc = (TextView) view1.findViewById(R.id.txt_disc);
            txtname.setText(Items.get(i).name);
            txtdisc.setText(Items.get(i).desc);


            return view1;


        }
    }
}

Upvotes: 1

Related Questions