У меня есть listview
:
<ListView
android:clickable="true"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
элементы, которые входят внутрь, выглядят следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/textview_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.76"
android:text="Choose"
android:clickable="true" />
<EditText
android:id="@+id/edittext_share"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_weight="0.12"
android:ems="10"
android:hint="share"
android:inputType="number" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/edittext_spent"
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_weight="0.11"
android:ems="10"
android:hint="spent"
android:inputType="number" />
</LinearLayout>
Я хочу, чтобы при нажатии на TextView
что-то должно произойти. Я установил setOnItemClickListener
через getListView()
но он не работает.
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
Toast.makeText(this,"clicked id="+arg2, Toast.LENGTH_SHORT).show();
}
а также
ListView lv = getListView();
lv.setOnItemClickListener(this);
Что мне делать, чтобы сделать textview доступным?
EDIT: мой код адаптера:
private class PeopleListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public Cursor cursor;
public ArrayList<PersonInfo> peopleList;
public ArrayList<PersonInfo> unsavedPeopleList;
public PeopleListAdapter(Context context, Cursor cursor) {
// Cache the LayoutInflate to avoid asking for a new one each time.
mInflater = LayoutInflater.from(context);
this.cursor = cursor;
peopleList = new ArrayList<PersonInfo>(cursor.getCount());
}
public PeopleListAdapter(Context context, Cursor cursor,
ArrayList<PersonInfo> unsavedList) {
this(context, cursor);
this.unsavedPeopleList = unsavedList;
}
/**
* The number of items in the list is determined by the number of
* speeches in our array.
*
* @see android.widget.ListAdapter#getCount()
*/
public int getCount() {
return peopleList.size() + unsavedPeopleList.size();
}
/**
* Since the data comes from an array, just returning the index is
* sufficent to get at the data. If we were using a more complex data
* structure, we would return whatever object represents one row in the
* list.
*
* @see android.widget.ListAdapter#getItem(int)
*/
public Object getItem(int position) {
return position;
}
/**
* Use the array index as a unique id.
*
* @see android.widget.ListAdapter#getItemId(int)
*/
public long getItemId(int position) {
return position;
}
/**
* Make a view to hold each row.
*
* @see android.widget.ListAdapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
public View getView(int position, View convertView, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid
// unneccessary calls
// to findViewById() on each row.
ViewHolder holder;
// When convertView is not null, we can reuse it directly, there is
// no need
// to reinflate it. We only inflate a new View when the convertView
// supplied
// by ListView is null.
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_person_info,
null);
// Creates a ViewHolder and store references to the two children
// views
// we want to bind data to.
holder = new ViewHolder();
holder.name = (TextView) convertView
.findViewById(R.id.textview_name);
holder.share = (EditText) convertView
.findViewById(R.id.edittext_share);
holder.spent = (EditText) convertView
.findViewById(R.id.edittext_spent);
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}
// Bind the data efficiently with the holder.
PersonInfo p = getPersonInfo(position);
holder.name.setText(p.name);
holder.name.setTag(p.lookupUri);
holder.share.setText(p.share + "");
holder.spent.setText(p.spent + "");
return convertView;
}
PersonInfo getPersonInfo(int position) {
if (position < peopleList.size()) {
PersonInfo pInfo = peopleList.get(position);
if (pInfo == null) {
pInfo = new PersonInfo();
cursor.moveToPosition(position);
pInfo.lookupUri = Uri.parse(cursor.getString(0));
Cursor c = NewEventActivity.this.getContentResolver()
.query(pInfo.lookupUri,
new String[] { Contacts._ID,
Contacts.DISPLAY_NAME }, null,
null, null);
pInfo.share = cursor.getInt(1);
pInfo.spent = cursor.getInt(2);
try {
if (c.moveToFirst()) {
pInfo.name = c.getString(1);
}
} finally {
cursor.close();
}
peopleList.set(position, pInfo);
}
return pInfo;
} else {
return unsavedPeopleList.get(position - peopleList.size());
}
}
Вам нужно установить прослушиватель прослушивателя Click в TextView в адаптере в функции getView()......
посмотреть ссылку
private class PeopleListAdapter extends BaseAdapter implements
OnClickListener {
..............................
............................
public View getView(int position, View convertView, ViewGroup parent) {
......................
.....................
holder.name.setText(p.name);
//holder.name.setTag(p.lookupUri);
holder.share.setText(p.share + "");
holder.spent.setText(p.spent + "");
holder.name.setOnClickListener(this);
holder.name.setTag(position);
return convertView;
}
@Override
public void onClick(View v) {
Log.d("Sample", "Clicked on tag: " + v.getTag());
////get PersonInfo using getPersonInfo(position)
}
listactivity
так, как бы там функционировал getView()
?
Если вы используете ListActicvity, тогда доступен метод по умолчанию, называемый onListItemClick()
. Вы должны переопределить этот метод в ListActivity,
protected void onListItemClick(android.widget.ListView l, android.view.View v, int position, long id) {
//find which item is clicked using the view object
};
Из того, что я понял, это то, что вы хотите: вы хотите, чтобы TextView внутри ListView был доступен для кликабеля, выполнял некоторую операцию на основе этого, и у вас есть элементы с пользовательским расположением внутри ListView
Итак: setOnItemClickListener не будет работать, потому что он добавляет слушателя для всего элемента внутри ListView, а не для элементов внутри него.
Для этого вы можете сделать это: добавьте тег к элементам внутри вашего ListView и внутри метода getView вам предоставляется позиция по умолчанию, используя это и используя тег с помощью метода getTag(), вы можете различать, что было нажато и в xml вы можете просто объявить onClick() и предоставить его определение
Установить на ClickListener В методе getListView() TextView.
Благодарю.
onListItemClick