osayilgan
osayilgan

Reputation: 5893

First Item in a ListView is not working properly in Android

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

Answers (1)

Eldhose M Babu
Eldhose M Babu

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

Related Questions