Android-仅适用于监听器*有时*不工作
我在我的一个活动中有一个Android-仅适用于监听器*有时*不工作,android,listview,Android,Listview,我在我的一个活动中有一个列表视图,我已使用自定义ArrayAdapter绑定到ArrayList。我已经将一个OnItemClickListener设置为ListView,它应该调用启动另一个活动的方法。但是,我发现,当我单击列表视图项时,它有时才起作用。有时,它会按其应该的方式启动活动;其他时候,它似乎检测到点击(涟漪效应出现在列表项上),但什么也不做;其他时候,它甚至不会检测到点击(不会出现连锁反应) 我尝试了我遇到的所有常见建议:在父视图项上阻止子体,在项视图的所有组件上将clickabl
列表视图
,我已使用自定义ArrayAdapter
绑定到ArrayList
。我已经将一个OnItemClickListener
设置为ListView
,它应该调用启动另一个活动的方法。但是,我发现,当我单击列表视图
项时,它有时才起作用。有时,它会按其应该的方式启动活动;其他时候,它似乎检测到点击(涟漪效应出现在列表项上),但什么也不做;其他时候,它甚至不会检测到点击(不会出现连锁反应)
我尝试了我遇到的所有常见建议:在父视图项上阻止子体,在项视图的所有组件上将clickable和focusable设置为false,在自定义适配器中将isEnabled设置为true,等等,但行为保持不变。谢谢你的帮助。以下是相关代码:
包含ListView的活动:
public class ViewCollectionActivity extends AppCompatActivity {
private final String className = this.getClass().getSimpleName();
private CollectionHandler collectionHandler;
private Context context;
private ArrayList<Game> displayedCollection;
private GameCollectionAdapter collectionAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_collection);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
context = this;
collectionHandler = CollectionHandler.getInstance(this);
TextView view = null;
if (collectionHandler.getDisplayedCollection().size() > 0) {
view = (TextView) findViewById(R.id.no_items_textview);
view.setVisibility(View.GONE);
}
String currentDate = collectionHandler.getDateLastSynchronised();
view = (TextView) findViewById(R.id.last_updated_textview);
view.setText("Last synchronised: " + currentDate + " Total games: " + String.valueOf(collectionHandler.getDisplayedCollection().size()));
collectionAdapter = collectionHandler.getCollectionAdapter();
ListView listView = (ListView) findViewById(R.id.collection_list_view);
listView.setAdapter(collectionAdapter);
AdapterView.OnItemClickListener collectionItemClickListener = new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
launchGameDetailsActivity(position);
}
};
listView.setOnItemClickListener(collectionItemClickListener);
}
public void launchGameDetailsActivity(int position){
Log.d(className,"Starting lauchGameDetailsActivity method");
collectionHandler.setSelectedGame(position);
Intent intent = new Intent(this,ViewGameDetailsActivity.class);
startActivity(intent);
Log.d(className, "Ending lauchGameDetailsActivity method");
}
公共类ViewCollectionActivity扩展了AppCompativeActivity{
私有最终字符串className=this.getClass().getSimpleName();
私有CollectionHandler CollectionHandler;
私人语境;
私有ArrayList displayedCollection;
私人游戏收集适配器收集适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u view\u collection);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
上下文=这个;
collectionHandler=collectionHandler.getInstance(此);
TextView=null;
if(collectionHandler.getDisplayedCollection().size()>0){
视图=(TextView)findViewById(R.id.no\u items\u TextView);
view.setVisibility(view.GONE);
}
字符串currentDate=collectionHandler.GetDateLastSynchronized();
视图=(TextView)findViewById(R.id.last\u updated\u TextView);
view.setText(“上次同步:+currentDate+”游戏总数:+String.valueOf(collectionHandler.getDisplayedCollection().size());
collectionAdapter=collectionHandler.getCollectionAdapter();
ListView ListView=(ListView)findViewById(R.id.collection\u list\u view);
setAdapter(collectionAdapter);
AdapterView.OnItemClickListener collectionItemClickListener=新建AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
发射活动(位置);
}
};
setOnItemClickListener(collectionItemClickListener);
}
public void launchGameDetailsActivity(内部位置){
d(类名,“启动lauchGameDetailsActivity方法”);
collectionHandler.SetSelectedName(位置);
意向意向=新意向(此,ViewGameDetailsActivity.class);
星触觉(意向);
d(类名,“结束lauchGameDetailsActivity方法”);
}
活动的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.bleachedlizard.ludome.viewcollection.ViewCollectionActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Synchronise Collection"
android:onClick="synchroniseCollection"/>
<TextView
android:id="@+id/last_updated_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Last synchronised: "
android:textAlignment="center"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Display Collection"
android:visibility="gone"
android:onClick="displayCollection"/>
<ListView
android:id="@+id/collection_list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
<TextView
android:id="@+id/no_items_textview"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="You have no items in your collection."
android:textAlignment="center"
android:textSize="20sp"/>
</LinearLayout>
项目视图的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/collection_item_layout"
android:layout_width="match_parent"
android:layout_height="75dp"
android:orientation="horizontal"
android:clickable="false"
android:descendantFocusability="blocksDescendants"
android:focusable="false"
android:focusableInTouchMode="false">
<ImageView
android:id="@+id/collection_item_image"
android:layout_width="75dp"
android:layout_height="75dp"
android:src="@drawable/testimage"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
/>
<TextView
android:id="@+id/collection_item_name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:padding="16dp"
android:singleLine="false"
android:textColor="@android:color/darker_gray"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
android:textIsSelectable="false"/>
<TextView
android:id="@+id/collection_item_plays"
android:layout_width="100dp"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:padding="8dp"
android:textColor="@android:color/darker_gray"
android:text="Plays: 0"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
android:textIsSelectable="false"/>
</LinearLayout>
自定义适配器的代码:
public class GameCollectionAdapter extends ArrayAdapter<Game> {
private ArrayList<Game> collection;
public GameCollectionAdapter(Context context, int resource, ArrayList<Game> collection){
super(context, resource, collection);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout gameView = (LinearLayout) convertView;
LayoutInflater mInflater = LayoutInflater.from(getContext());
if (gameView == null) {
gameView = (LinearLayout) mInflater.inflate(R.layout.collection_item_view, null);
}
//Game game = collection.get(position);
Game game = super.getItem(position);
if (game != null) {
// This is how you obtain a reference to the TextViews.
// These TextViews are created in the XML files we defined.
TextView gameTitle = (TextView) gameView.findViewById(R.id.collection_item_name);
TextView numOfPlays = (TextView) gameView.findViewById(R.id.collection_item_plays);
ImageView thumbnail = (ImageView) gameView.findViewById(R.id.collection_item_image);
// check to see if each individual textview is null.
// if not, assign some text!
if (gameTitle != null){
gameTitle.setText(game.getTitle());
}
if (numOfPlays != null){
numOfPlays.setText("Plays: " + String.valueOf(game.getNumOfPlays()));
}
if (thumbnail != null){
thumbnail.setImageBitmap(game.getThumbnail());
}
}
// the view must be returned to our activity
return gameView;
}
@Override
public boolean isEnabled(int position) {
return true;
}
}
公共类GameCollectionAdapter扩展了ArrayAdapter{
私人收藏;
PublicGameCollectionAdapter(上下文上下文、int资源、ArrayList集合){
超级(上下文、资源、集合);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LinearLayout游戏视图=(LinearLayout)convertView;
LayoutInflater mInflater=LayoutInflater.from(getContext());
如果(gameView==null){
gameView=(LinearLayout)mInflater.充气(R.layout.collection\u item\u视图,空);
}
//游戏=收集。获取(位置);
Game=super.getItem(位置);
如果(游戏!=null){
//这是获取对TextView的引用的方式。
//这些文本视图是在我们定义的XML文件中创建的。
TextView gameTitle=(TextView)gameView.findViewById(R.id.collection\u item\u name);
TextView numOfPlays=(TextView)gameView.findViewById(R.id.collection\u item\u plays);
ImageView缩略图=(ImageView)gameView.findViewById(R.id.collection\u item\u image);
//检查每个文本视图是否为空。
//如果没有,请指定一些文本!
如果(游戏标题!=null){
gameTitle.setText(game.getTitle());
}
if(numOfPlays!=null){
numOfPlays.setText(“Plays:+String.valueOf(game.getNumOfPlays()));
}
如果(缩略图!=null){
setImageBitmap(game.getThumbnail());
}
}
//视图必须返回到我们的活动
返回游戏视图;
}
@凌驾
公共布尔值isEnabled(整型位置){
返回true;
}
}
我认为问题是由于每当您单击时项目选择的位置。您有一个列表位置,该位置将传递给您的方法launchGameDetailActivity(int位置)
使用log或toast检查项目单击您获得的所有位置做需要的事情
这是我的代码,如果有帮助的话,可以这样尝试
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(RecipeClass.this, "Position is" + position, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(RecipeClass.this, RecipeIngredients.class)
intent.putExtra("position", position);
startActivity(intent);
}
listView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Toast.makeText(RecipeClass.this,“Position is”+Position,Toast.LENGTH_SHORT).show();
意向意向=新意向(RecipeClass.this、RecipeIngElements.class)
意图。额外(“位置”,位置);
星触觉(意向);
}
检查您的arraylist值