Reputation: 5893
According to my application that I'm working on, I need to create a list view and then handle the events when the user clicks on each item. Everything works fine except the first item in the list view. It's not clickable for the first time list view is loaded, after I scroll up or down the list view it works perfectly. And one more thing, for the first time list view is loaded If I click the first item and then second item, a toast message shows the second item's name firstly and then first item's name. So as a result the first item in the list view is not active until list view is scrolled or clicked. Here is my code for this fragment. Any idea how to handle it ?
public EyeDiseasesFragment(File diseasesJsonFile) {
this.diseasesJsonFile = diseasesJsonFile;
mainUrl = Config.mainUrl;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
diseasesList = new ArrayList<Diseases>();
new LoadContent().execute();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listener = (MainFragmentController) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnArticleSelectedListener");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.diseases, container, false);
mList = (ListView) view.findViewById(R.id.diseases);
return view;
}
class DiseasesAdapter extends BaseAdapter {
LayoutInflater inflater;
public DiseasesAdapter() {
inflater = (LayoutInflater) getActivity().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return diseasesList.size();
}
@Override
public Diseases getItem(int arg0) {
return diseasesList.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(final int position, View convertView, ViewGroup arg2) {
final Diseases item;
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.diseases_item, null);
holder.title = (TextView) convertView.findViewById(R.id.disease_item_header);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
item = getItem(position);
holder.title.setText(item.diseaseName);
convertView.setLayoutParams(new ListView.LayoutParams(
LayoutParams.MATCH_PARENT, HelperStaticMethods.getDIP(
getActivity(), 50)));
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
listener.onDiseasItemClick(item);
}
});
return convertView;
}
}
class ViewHolder {
TextView title;
}
class LoadContent extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
setDiseasesInformation(getActivity());
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
mList.setCacheColorHint(Color.TRANSPARENT);
mList.setDivider(null);
mList.setVerticalFadingEdgeEnabled(false);
DiseasesAdapter adapter = new DiseasesAdapter();
mList.setAdapter(adapter);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
}
EDIT
moving the code below into statement where convertView is Null solved the problem.
if (convertView == null) {
// ... after inflating the view
convertView.setLayoutParams(new ListView.LayoutParams(
LayoutParams.MATCH_PARENT, HelperStaticMethods.getDIP(getActivity(), 50)));
}
Upvotes: 4
Views: 1529
Reputation: 14520
Can you please try moving the code
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
listener.onDiseasItemClick(item);
}
});
inside
if (convertView == null){
.....
}
to make sure the listener is set once.
Upvotes: 2