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>
try this to get the focus: View.getFocus();
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.
This answer here worked for me: https://stackoverflow.com/a/16536355/5112161
Mainly he ADDED in the LinearLayout or RelativeLayout the following:
android:descendantFocusability="blocksDescendants"
You also need to REMOVE from all your xml the following:
android:focusable="false"
android:focusable="true"
android:clickable="true"
android:clickable="false"
Consider making the text value selectable by specifying android:textIsSelectable="true"
Don't listen to Google. In the rows' layout, set
textIsSelectable="false"
Thank you Lint (not!)
I wanted to add a comment to rupps answer, but I do not have enough reputation.
If you are using a custom adapter extending the ArrayAdapter you can overwrite with areAllItemsEnabled() and isEnabled(int position) in your class:
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
return true;
}
The above fixed my non clickable list view. Maybe this comment also helps others as "android list not clickable" search term is quite high in Google.
List view items are clickable. To use it, you have to set item click listener on your list view. Then it will work.
I'm pretty late but discovered something I think it's interesting about this:
if your adapter descends from ArrayAdapter, as much as I have tried, onItemClickListener is not called.
However, if your adapter descends from BaseAdapter (so you have to implement getCount() and getItem(), trivial for an array) it IS always called.
I was using a view and button inside the list view so I have used:
android:focusable="false"
for <button>
and <view>
...
After that I used following code for my list view and it worked
// Attach the adapter to a ListView
ListView listView = (ListView) findViewById(R.id.shipping_item_list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(listPairedClickItem);
private AdapterView.OnItemClickListener listPairedClickItem = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Toast.makeText(getBaseContext(), "Item ", Toast.LENGTH_LONG).show();
}
};
For me, the problem was that my items within my ListView had clickable
set to true
.
set android:clickable="false" android:focusable="fasle"
来源:https://stackoverflow.com/questions/8955270/listview-items-are-not-clickable-why