I have a ListView
that uses a customized adapter, but I can't click on the ListView Item ..
Activity for list view ..
package com.adhamenaya.projects; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.Filter; import android.widget.Filterable; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.adhamenaya.classes.Place; public class PlacesListActivity extends Activity { private ArrayList<Place> places; private ArrayList<String> items; GridviewAdapter mAdapter; private ListView lvPlaces; private EfficientAdapter adap; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.places_list); lvPlaces = (ListView) this.findViewById(R.id.lvPlaces); new DowanloadPlaces().execute(""); } private void bindList(ArrayList<Place> places) { this.places = places; // Start creating the list view to show articles items = new ArrayList<String>(); for (int i = 0; i < places.size(); i++) { items.add(String.valueOf(places.get(i).mName)); } adap = new EfficientAdapter(this); adap.notifyDataSetChanged(); lvPlaces.setAdapter(adap); } // EfficientAdapter : to make a customized list view item public class EfficientAdapter extends BaseAdapter implements Filterable { // The function of inflater to convert objects from XML layout file (i.e. main.xml) to a programmable LayoutInflater inflater; Context context; public EfficientAdapter(Context context) { inflater = LayoutInflater.from(context); this.context = context; } public int getCount() { // Get the number of items in the list return items.size(); } public Object getItem(int position) { // To return item from a list in the given position return items.get(position); } public long getItemId(int position) { // TODO Auto-generated method stub return 0; } public View getView(final int position, View convertView,ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.adaptor_content, null); holder = new ViewHolder();// Create an object to hold at components in the list view item holder.textLine = (TextView) convertView.findViewById(R.id.textLine); holder.buttonLine = (Button) convertView.findViewById(R.id.buttonLine); holder.buttonLine.setOnClickListener(new OnClickListener() { private int pos = position; public void onClick(View v) { places.remove(pos); bindList(places);// to bind list items Toast.makeText(getApplicationContext(),"Deleted successfuly :)", Toast.LENGTH_LONG).show(); } }); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // Bind the data efficiently with the holder. holder.textLine.setText(String.valueOf(places.get(position).mName)); return convertView; } public Filter getFilter() { // TODO Auto-generated method stub return null; } } // ViewHolder : class that represents a list view items static class ViewHolder { TextView textLine; Button buttonLine; } // DownloadRSSFeedsTask: works in a separate thread private class DowanloadPlaces extends AsyncTask<String, Void, ArrayList<Place>> { @Override protected ArrayList<Place> doInBackground(String... params) { ArrayList<Place> places = new ArrayList<Place>(); Place p = new Place(); for(int i =0;i<25;i++){ p.mName = "Al Mathaf Hotel"; places.add(p); } return places; } @Override protected void onPostExecute(ArrayList<Place> places) { bindList(places); } } }
places_list.xml layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/lvPlaces"> </ListView> </LinearLayout>
adaptor_content.xml layout
<ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textLine" android:layout_centerVertical="true" android:src="@drawable/settings" /> </RelativeLayout>
Android doesn't allow to select list items that have focusable elements (buttons). Modify the button's xml attribute to:
android:focusable="false"
It should still be clickable, just won't gain focus...
I had the same issue with a ListView which contained only a RadioButton:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <RadioButton android:id="@+id/userNameRadioButton" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
I used the RadioButton in each row to display the default item selection, to make ListView handle clicks I had to use:
radioButton.setFocusableInTouchMode(false); radioButton.setFocusable(false);
or in the XML-file:
android:focusable="false" android:focusableInTouchMode="false"
So it is a focus related issue... With the above modifiers the focus is directed to ListView on click.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With