This is gonna be long due to code. So I have a question about OnItemclickListener vs OnclickListener,and here I have two codes one for each and both worked, so is there any preference to use one of the two or can I use anyone??? Here is code with OnItemClickListener
public class MainActivity extends AppCompatActivity {
private ArrayList<String> numbers=new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //a listview with id "list"
ListView numberLV = (ListView) findViewById(R.id.list);
numbers.add("one");
numbers.add("two");
numbers.add("three");
numbers.add("four");
// and so on
listAdapter itemadapter=new listAdapter(this,numbers);
numberLV.setAdapter(itemadapter);
numberLV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String num=numbers.get(position);
String display="You have clicked "+num;
Toast.makeText(MainActivity.this,display,Toast.LENGTH_SHORT).show();
}
});
}
}
class listAdapter extends ArrayAdapter<String> {
public listAdapter(@NonNull Context context, ArrayList<String> numbers){
super(context,0,numbers);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView;
if(listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.list_num, parent, false);
}
TextView tvnum=(TextView) listItemView.findViewById(R.id.numbersTV);
String num=getItem(position);
tvnum.setText(num);
return listItemView;
}
}
and here's one with OnClickListener
public class MainActivity extends AppCompatActivity {
private ArrayList<String> numbers=new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //a listview with id "list"
ListView numberLV = (ListView) findViewById(R.id.list);
numbers.add("one");
numbers.add("two");
numbers.add("three");
numbers.add("four");
// and so on
listAdapter itemadapter=new listAdapter(this,numbers);
numberLV.setAdapter(itemadapter);
}
}
class listAdapter extends ArrayAdapter<String> {
public listAdapter(@NonNull Context context, ArrayList<String> numbers){
super(context,0,numbers);
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView;
if(listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.list_num, parent, false);
}
TextView tvnum=(TextView) listItemView.findViewById(R.id.numbersTV);
String num=getItem(position);
tvnum.setText(num);
listItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String display="You have clicked "+getItem(position);
Toast.makeText(getContext(),display,Toast.LENGTH_SHORT).show();
}
});
return listItemView;
}
}
Both codes worked normally for me, but the confusion was whether the second one was right or wrong??
The setOnItemClickListener
is the preferred way of attaching the click listener on the items of the adapter as mentioned by the first comment above.
In your second scenario, where you have setOnClickListener
attached on individual item inside the getView
method which is also valid because the ItemView in this case is an indirect subclass on View
on which setOnClickListener
originally declared.