Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Onclicklistner not working in fragment listview

I have a listview with custom adapter in listfragment and also set onclicklistner for listview. But Onclicklistner does not work.

Here is my code:

public class BasicFragment extends ListFragment {

ListView lv;
MyCustomAdapter adapter;

@Override
public void onCreate(Bundle si) {
    super.onCreate(si);
}

@Override
public void onActivityCreated(Bundle b) {
    super.onActivityCreated(b);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_basic, container, false);
    lv = (ListView) view.findViewById(android.R.id.list);
    FetchedData DT = FetchedData.StaticDataTransfer();
    RecepiesProperties[] AryObjaz = DT.getData();
    getdata(AryObjaz);
    adapter = new MyCustomAdapter(getActivity(), R.layout.listview_layout,
            Dataset);
    lv.setAdapter(adapter);

    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            Toast t = Toast.makeText(getActivity(), "Message",
                    Toast.LENGTH_SHORT);
            t.show();
        }
    });

    return view;
}}

MyCustomAdapter.java

public class MyCustomAdapter extends ArrayAdapter<Recipes> {

Context context;
int layoutResourceId;
Recipes data[] = null;
Typeface typeface;
public ImageLoader imageLoader;

public MyCustomAdapter(Context context, int textViewResourceId,
        Recipes[] dataset) {
    super(context, textViewResourceId, dataset);
    this.layoutResourceId = textViewResourceId;
    this.context = context;
    this.data = dataset;
    imageLoader = new ImageLoader(context.getApplicationContext());
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;

    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    row = inflater.inflate(layoutResourceId, parent, false);
    RecipesHolder holder = new RecipesHolder();
    holder.imgIcon = (ImageView) row.findViewById(R.id.imageView1);
    holder.txtTitle = (TextView) row.findViewById(R.id.title);
    holder.category = (TextView) row.findViewById(R.id.category);
    holder.source = (TextView) row.findViewById(R.id.source);
    holder.country = (TextView) row.findViewById(R.id.country);
    holder.readytime = (TextView) row.findViewById(R.id.readytime);
    holder.tips = (Button) row.findViewById(R.id.tips);
    holder.fav = (Button) row.findViewById(R.id.fav);

    Recipes ap = data[position];

    imageLoader.DisplayImage(ap.getIMAGENAME240(), holder.imgIcon);
    holder.txtTitle.setText(ap.getNAME());
    holder.category.setText(ap.getCATEGORY());
    holder.source.setText(ap.getSOURCE());
    holder.country.setText(ap.getCOUNTRY());
    holder.readytime.setText(ap.getREADYTIME());

    return row;
}

static class RecipesHolder {
    ImageView imgIcon;
    TextView txtTitle;
    TextView category;
    TextView source;
    TextView country;
    TextView readytime;
    Button tips;
    Button fav;
}}

//listview_layout.xml

<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"><ImageView
    android:id="@+id/imageView1"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentLeft="true"
    android:focusable="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="5dp"
    android:layout_marginTop="10dp" />

<TextView
    android:id="@+id/readytime"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/country"
    android:layout_alignBottom="@+id/country"
    android:layout_marginLeft="73dp"
    android:layout_toRightOf="@+id/country"
    android:focusable="true"
    android:text="TextView"
    android:textColor="#000" />

<TextView
    android:id="@+id/country"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/imageView1"
    android:layout_alignLeft="@+id/source"
    android:focusable="true"
    android:text="TextView"
    android:textColor="#000" />

<TextView
    android:id="@+id/source"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/country"
    android:layout_alignLeft="@+id/category"
    android:focusable="true"
    android:text="TextView"
    android:textColor="#000" />

<TextView
    android:id="@+id/category"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/source"
    android:layout_alignLeft="@+id/title"
    android:text="TextView"
    android:focusable="true"
    android:textColor="#000" />

<TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/category"
    android:layout_toRightOf="@+id/imageView1"
    android:text="TextView"
    android:focusable="true"
    android:textColor="#000" />

<Button
    android:id="@+id/fav"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/tips"
    android:layout_below="@+id/source"
    android:focusable="true"
    android:background="@drawable/favourite" />

<Button
    android:id="@+id/tips"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignTop="@+id/textView1"
    android:layout_marginRight="14dp"
    android:background="@drawable/yellow" /></RelativeLayout>
like image 810
jeevamuthu Avatar asked Feb 27 '13 14:02

jeevamuthu


3 Answers

finally solved the issue when all the controls(Buttons,textviews) in listview set to focusable false.

like image 58
jeevamuthu Avatar answered Oct 24 '22 17:10

jeevamuthu


Check your MyCustomAdapter, Some widget (such as: Button,ImageButton) in the custom layout will consume the click event and then the onItemClick will never get called.

Use the following code in your adaper's getView method to get the onClick event.

     row.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

        }
    });
like image 28
Bolton Avatar answered Oct 24 '22 17:10

Bolton


As per the Android API Doc:

ListFragment has a default layout that consists of a single list view. However, if you desire, you can customize the fragment layout by returning your own view hierarchy from onCreateView(LayoutInflater, ViewGroup, Bundle). To do this, your view hierarchy must contain a ListView object with the id "@android:id/list" (or list if it's in code)

Since you did not post the layout file for the fragment i am not sure what went wrong here. The following code is how it should be when you are using the default list view of ListFragment. If you are using the ListFragment you should leverage the additional methods available like setListAdapter and onListItemClick. You can additionally do the same thing without using a ListFragment (Using just Fragment).

The Fragment Code (Modified your piece of code)

public class BasicFragment extends ListFragment {

    MyCustomAdapter adapter;

    @Override
    public void onCreate(Bundle si) {
        super.onCreate(si);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // not sure what you are doing here but data fetch should be asynchronous if it interacts with DB or makes network call
        FetchedData DT = FetchedData.StaticDataTransfer();
        RecepiesProperties[] AryObjaz = DT.getData();
        getdata(AryObjaz);
        adapter = new MyCustomAdapter(getActivity(), R.layout.listview_layout, Dataset);
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Toast t = Toast.makeText(getActivity(), "Message",
        Toast.LENGTH_SHORT);
        t.show();

    }
}

Additionally i modified your adapter code to help recycle views, your current code was not using view recycling and was always inflating views.

Adapter code:

public class MyCustomAdapter extends ArrayAdapter<Recipes> {

    Context context;
    int layoutResourceId;
    Recipes data[] = null;
    Typeface typeface;
    public ImageLoader imageLoader;
    private LayoutInflater inflater;

    public MyCustomAdapter(Context context, int textViewResourceId, Recipes[] dataset) {
        super(context, textViewResourceId, dataset);
        this.layoutResourceId = textViewResourceId;
        this.context = context;
        this.data = dataset;
        imageLoader = new ImageLoader(context.getApplicationContext());
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        RecipesHolder holder = null;
        //recycling views
        if(null == row){
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new RecipesHolder();
            holder.imgIcon = (ImageView) row.findViewById(R.id.imageView1);
            holder.txtTitle = (TextView) row.findViewById(R.id.title);
            holder.category = (TextView) row.findViewById(R.id.category);
            holder.source = (TextView) row.findViewById(R.id.source);
            holder.country = (TextView) row.findViewById(R.id.country);
            holder.readytime = (TextView) row.findViewById(R.id.readytime);
            holder.tips = (Button) row.findViewById(R.id.tips);
            holder.fav = (Button) row.findViewById(R.id.fav);
            row.setTag(holder);
        }else{
            holder = (RecipesHolder)row.getTag();
        }
        Recipes ap = data[position];

        imageLoader.DisplayImage(ap.getIMAGENAME240(), holder.imgIcon);
        holder.txtTitle.setText(ap.getNAME());
        holder.category.setText(ap.getCATEGORY());
        holder.source.setText(ap.getSOURCE());
        holder.country.setText(ap.getCOUNTRY());
        holder.readytime.setText(ap.getREADYTIME());

        return row;
    }

    static class RecipesHolder {
        ImageView imgIcon;
        TextView txtTitle;
        TextView category;
        TextView source;
        TextView country;
        TextView readytime;
        Button tips;
        Button fav;
    }
}
like image 45
Abhishek Nandi Avatar answered Oct 24 '22 17:10

Abhishek Nandi