问题
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>
回答1:
try this to get the focus: View.getFocus();
回答2:
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...
回答3:
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.
回答4:
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"
回答5:
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.
回答6:
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!)
回答7:
List view items are clickable. To use it, you have to set item click listener on your list view. Then it will work.
回答8:
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.
回答9:
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();
}
};
回答10:
For me, the problem was that my items within my ListView had clickable
set to true
.
回答11:
set android:clickable="false" android:focusable="fasle"
来源:https://stackoverflow.com/questions/8955270/listview-items-are-not-clickable-why