Intereting Posts
Есть ли способ отправить аудиофайл в распознавание речи на текст Android 4.2 нарушил мой шифрованный / дешифрованный код, и предоставленные решения не работают ViewPager внутри ViewPager Нарисовать закругленную краевую дугу в андроиде с рельефным эффектом Несоответствие обнаружено в RecyclerView, Как изменить содержимое RecyclerView при прокрутке Использование шаблона проектирования Singleton для SQLiteDatabase Просмотр не подключен к оконному менеджеру, диалог отклонен Как использовать камеру Android с OpenGL ES для работы? Android – Сделать панель поиска целиком доступной Android включает и выключает Wi-Fi HotSpot программно Как проверить расширение файла в android Как проверить подключение Wi-Fi, но нет доступа к Интернету в Android OnDestroy вызывается каждый раз, когда экран продолжается Каковы наилучшие методы использования AES-шифрования в Android? Использование GCM на Android и iOS без полезной информации уведомления

Невозможно нажать на элементы в ListView с помощью настраиваемого адаптера

Я пытаюсь написать приложение, которое берет элементы из базы данных и заполняет строки в ListView. Я не могу нажимать на элементы после нажатия на строки, и dpad тоже не попадет ни в одну из строк. Я использую пользовательский адаптер.

Tweet.xml

<?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="?android:attr/listPreferredItemHeight" android:padding="6dip" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/textUser" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:text="NAME"/> <TextView android:id="@+id/textDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#333333" android:text="DATE" /> </LinearLayout> <TextView android:id="@+id/textTweet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TWEET" /> </LinearLayout> 

Activity_main.xml

 <?xml version="1.0" encoding="UTF-8"?> <ListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" tools:context=".MainActivity" > </ListView> 

Метод Oncreate

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView view = (ListView) findViewById(R.id.listView); MyArrayAdapter theAdapter = new MyArrayAdapter(tweetDb,this); //setContentView(theAdapter.getView(0, null, null)); view.setAdapter(theAdapter); view.setOnItemClickListener( new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { //Tweet theTweet = (Tweet)parent.getAdapter().getItem(position); //saved.insert(theTweet); Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_LONG).show(); Log.v("SCHEMA", "onItemClick fired!"); } } ); } 

Класс адаптера getView

 @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater)context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); View tweetView = inflater.inflate(R.layout.tweet, null); TextView textTweet = (TextView) tweetView.findViewById(R.id.textTweet); textTweet.setText(items.get(position).getTweet()); textTweet = (TextView)tweetView.findViewById(R.id.textUser); textTweet.setText(items.get(position).getName()); textTweet = (TextView)tweetView.findViewById(R.id.textDate); textTweet.setText(textFormat.format(items.get(position).getCreated())); return tweetView; } 

Класс MyArrayAdapter

 import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import android.content.Context; import android.database.Cursor; import android.database.DataSetObserver; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ListAdapter; import android.widget.TextView; import android.widget.Toast; public class MyArrayAdapter implements ListAdapter { private ArrayList<Tweet> items; private Context context; private SimpleDateFormat textFormat = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); public MyArrayAdapter(TweetDbSource db, Context context) { items = new ArrayList<Tweet>(); this.context = context; Cursor cursor = db.getReadableDatabase().query("Tweet", null, null, null, null, null, null); while (!cursor.isLast()) { cursor.moveToNext(); items.add(new Tweet(cursor.getLong(0),cursor.getLong(1),cursor.getString(2),cursor.getString(3), cursor.getString(4),new Date(),cursor.getInt(6))); } } @Override public int getCount() { return items.size(); } @Override public Object getItem(int position) { return items.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater)context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); OnClickListener saveTweet = new OnClickListener() { public void onClick(View v) { Toast.makeText(v.getContext(), "Saved", Toast.LENGTH_LONG).show(); } }; View tweetView = inflater.inflate(R.layout.tweet, null); TextView textTweet = (TextView) tweetView.findViewById(R.id.textTweet); textTweet.setText(items.get(position).getTweet()); textTweet = (TextView)tweetView.findViewById(R.id.textUser); textTweet.setText(items.get(position).getName()); textTweet = (TextView)tweetView.findViewById(R.id.textDate); textTweet.setText(textFormat.format(items.get(position).getCreated())); return tweetView; } @Override public int getViewTypeCount() { // TODO Auto-generated method stub return 1; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public boolean isEmpty() { // TODO Auto-generated method stub return items.size() == 0; } @Override public void registerDataSetObserver(DataSetObserver arg0) { // TODO Auto-generated method stub } @Override public void unregisterDataSetObserver(DataSetObserver arg0) { // TODO Auto-generated method stub } @Override public boolean areAllItemsEnabled() { // TODO Auto-generated method stub return false; } @Override public boolean isEnabled(int arg0) { // TODO Auto-generated method stub return false; } } 

Тост или журнал не работает, вот как я могу сказать, что он не работает

Обновлен метод getView

 public View getView(int position, View convertView, ViewGroup parent) { OnClickListener SaveView = new OnClickListener() { @SuppressLint("NewApi") public void onClick(View v) { Toast.makeText(v.getContext(), "Saved", Toast.LENGTH_LONG).show(); v.callOnClick(); } }; LayoutInflater inflater = (LayoutInflater)context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); View tweetView = inflater.inflate(R.layout.tweet, null); TextView textTweet = (TextView) tweetView.findViewById(R.id.textTweet); textTweet.setText(items.get(position).getTweet()); textTweet = (TextView)tweetView.findViewById(R.id.textUser); textTweet.setText(items.get(position).getName()); textTweet = (TextView)tweetView.findViewById(R.id.textDate); textTweet.setText(textFormat.format(items.get(position).getCreated())); tweetView.setOnClickListener(SaveView); return tweetView; } 

ОБНОВИТЬ

Проблема была решена, и я понял: DI должен был вернуть true вместо false в этих двух методах в моем классе адаптера!

 @Override public boolean areAllItemsEnabled() { return true; } @Override public boolean isEnabled(int arg0) { return true; } 

Solutions Collecting From Web of "Невозможно нажать на элементы в ListView с помощью настраиваемого адаптера"

Обычно это происходит из-за того, что элементы в списке отображаются в фокусе. Попробуйте добавить

 android:descendantFocusability="blocksDescendants" 

В пользовательской строке списка

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:padding="6dip" android:orientation="vertical" android:descendantFocusability="blocksDescendants"> 

Я обычно помещаю прослушиватель кликов в сам адаптер:

 @Override public View getView(int position, View convertView, ViewGroup parent) { OnClickListener yourClickListener = new OnClickListener() { public void onClick(View v) { //put your desired action here v.callOnClick(); } }; ... // then add the listener to your view tweetView.setOnClickListener(yourClickListener); 

Добавить внутри метод onItemClick:

 v.setSelected(true); 

Добавьте строку ниже в свой ListView xml

 android:choiceMode="singleChoice" 

Пробовал это?

  @Override public boolean isEnabled(int position) { //Set a Toast or Log over here to check. return true; }