gpt4 book ai didi

android - ListFragment OnListItemClick 未被调用

转载 作者:IT老高 更新时间:2023-10-28 21:44:27 25 4
gpt4 key购买 nike

我有一个扩展 ListFragment 的类,它覆盖了 OnListItemClick 方法。我也在另一个 ListFragment 中以相同的方式执行此操作(并且该方法被调用)。我想知道为什么单击列表项时没有调用该方法?

代码如下:

package org.doraz.fdboard.activity;

import java.sql.SQLException;
import java.util.Collection;

import org.doraz.fdboard.FantasyDraftBoardApplication;
import org.doraz.fdboard.R;
import org.doraz.fdboard.activity.DraftBoardActivity.PlayerDetailsActivity;
import org.doraz.fdboard.domain.FantasyLeague;
import org.doraz.fdboard.domain.FantasyTeam;
import org.doraz.fdboard.domain.Player;
import org.doraz.fdboard.domain.Position;
import org.doraz.fdboard.repository.FantasyDraftBoardRepository;
import org.doraz.fdboard.view.PlayerAdapter;
import org.doraz.fdboard.view.PlayerCursorAdapter;

import android.app.FragmentTransaction;
import android.app.ListFragment;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class ListPlayersFragment extends ListFragment implements OnItemClickListener {

private final static String TAG = "ListPlayersFragment";

private boolean mDualPane;
private int curSelectedPlayerPosition = 0;
private PlayerCursorAdapter playerAdapter;
private QueryPlayersTask currentTask;

private FantasyDraftBoardRepository repository;
private FantasyLeague fantasyLeague;
private FantasyTeam fantasyTeam;
private Position position;
private ProgressDialog progressDialog;


/* (non-Javadoc)
* @see android.app.ListFragment#onActivityCreated(android.os.Bundle)
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

//Check for the view players view along with the pane
View teamListFragment = getActivity().findViewById(R.id.team_list_fragment);
mDualPane = teamListFragment != null && teamListFragment.getVisibility() == View.VISIBLE;

if(mDualPane) {
Log.i(TAG, "Setting list select mode to single");
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}

getListView().setSmoothScrollbarEnabled(false);
}

/* (non-Javadoc)
* @see android.app.ListFragment#onListItemClick(android.widget.ListView, android.view.View, int, long)
*/
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Log.i(TAG, "[onListItemClick] Selected Position "+ position);
selectPlayer(position);
}

/* (non-Javadoc)
* @see android.app.Fragment#onSaveInstanceState(android.os.Bundle)
*/
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("curSelectedPlayerPosition", curSelectedPlayerPosition);
outState.putInt("fantasyLeague", fantasyLeague.getLeaguePID());

if(!Position.ALL.equals(position)) {
outState.putInt("position", position.getPositionPID());
}

if(!(FantasyTeam.ALL_AVAILABLE_TEAM.equals(fantasyTeam) || FantasyTeam.ALL_TEAM.equals(fantasyTeam))) {
outState.putInt("fantasyTeam", fantasyTeam.getTeamPID());
}
}

/**
* Selects the player at this position in the current list
* @param listPosition
*/
public void selectPlayer(int listPosition) {
curSelectedPlayerPosition = listPosition;

Player player = (Player) playerAdapter.getItem(listPosition);

Log.i(TAG, "Select Player ("+ listPosition +", "+ player.getName() +") called");

//Get the player url
String mPlayerUrl = player.getPlayerUrl();
Log.d(TAG, "Selected Player URL: "+mPlayerUrl);

if(mDualPane) {
if(getListView().getSelectedItemPosition() == listPosition) {
//Remove the selected item
return;
}

//Select the item
getListView().setItemChecked(listPosition, true);

Log.d(TAG, "Creating ViewPlayerFragment");
ViewPlayerFragment vpf = ViewPlayerFragment.newInstance(mPlayerUrl);
ListTeamsFragment ltf = (ListTeamsFragment) getFragmentManager().findFragmentById(R.id.team_list_fragment);

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.player_web_view_fragment, vpf);

if(ltf != null && !ltf.isHidden()) {
//Hide the list of teams
ft.hide(ltf);
ft.addToBackStack(null);
}

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
Log.d(TAG, "Committed to ViewPlayerFragment");
}
else {
Log.d(TAG, "Launching new activity to view player");
Intent intent = new Intent();
intent.setClass(getActivity(), PlayerDetailsActivity.class);
intent.putExtra("playerURL", mPlayerUrl);
startActivityForResult(intent, 0);
}
}

public void clearSelectedPlayer() {
Log.i(TAG, "Clearing selected player");

curSelectedPlayerPosition = -1;

//Clear the list view
getListView().clearChoices();

ViewPlayerFragment vpf = (ViewPlayerFragment) getFragmentManager().findFragmentById(R.id.player_web_view_fragment);
if(vpf != null) {
Log.d(TAG, "Closing ViewPlayerFragment");

//Close the ViewPlayersFragment
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.remove(vpf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
ft.commit();
Log.d(TAG, "Closed ViewPlayerFragment");
}
}

/**
* Initializes the player adapter
*/
private void initializePlayerAdapter(Cursor cursor) {
if(playerAdapter != null)
return;

playerAdapter = new PlayerCursorAdapter(getActivity(), cursor, (DraftBoardActivity)getActivity(), repository);
setListAdapter(playerAdapter);
setEmptyText(getText(R.string.no_players_msg));
}

/**
* Initializes the player adapter
*/
public void setPlayersCursor(Cursor cursor) {
if(playerAdapter == null) {
initializePlayerAdapter(cursor);
}
else {
playerAdapter.changeCursor(cursor);
}
}

/**
* Drafts a player
*
* @param mPlayer the player to draft
* @param fantasyTeam the fantasy team
* @param value the draft value
*/
public void draftPlayer(Player mPlayer, FantasyTeam fantasyTeam, Double value) {

mPlayer.setFantasyTeam(fantasyTeam);
mPlayer.setDraftValue(value);
mPlayer.setDrafted(true);
fantasyTeam.draftPlayer(mPlayer);

try {
repository.savePlayer(mPlayer);
repository.saveFantasyTeam(fantasyTeam);
} catch (SQLException e) {
Log.e(TAG, "Error drafting player", e);
}

//Refresh the query
refresh();
}

/**
* Refreshes the players list
*/
public void refresh(){
if(fantasyLeague == null) {
fantasyLeague = ((FantasyDraftBoardApplication) (getActivity().getApplication())).getCurrentFantasyLeague();
}

if(fantasyTeam == null) {
fantasyTeam = FantasyTeam.ALL_AVAILABLE_TEAM;
}

if(position == null) {
position = Position.ALL;
}

if(currentTask != null) {
currentTask.cancel(true);
}

if(progressDialog != null) {
progressDialog.dismiss();
progressDialog = null;
}

progressDialog = ProgressDialog.show(getActivity(), null, "Loading...");
currentTask = new QueryPlayersTask(fantasyLeague, fantasyTeam, position, repository);
currentTask.execute();
}

/**
* Sets the fantasyLeague
* @param fantasyLeague the fantasyLeague to set
*/
public void setFantasyLeague(FantasyLeague fantasyLeague) {
this.fantasyLeague = fantasyLeague;
}

/**
* Sets the fantasyTeam
* @param fantasyTeam the fantasyTeam to set
*/
public void setFantasyTeam(FantasyTeam fantasyTeam) {
this.fantasyTeam = fantasyTeam;
}

/**
* Sets the position
* @param position the position to set
*/
public void setPosition(Position position) {
this.position = position;
}

/**
* Sets the repository
* @param repository the repository to set
*/
public void setRepository(FantasyDraftBoardRepository repository) {
this.repository = repository;
}

private class QueryPlayersTask extends AsyncTask<Integer, Integer, Cursor> {

private FantasyLeague fantasyLeague;
private FantasyTeam fantasyTeam;
private Position position;
private FantasyDraftBoardRepository repository;

public QueryPlayersTask(FantasyLeague fantasyLeague, FantasyTeam fantasyTeam, Position position, FantasyDraftBoardRepository repository) {
this.fantasyLeague = fantasyLeague;
this.fantasyTeam = fantasyTeam;
this.position = position;
this.repository = repository;
}

@Override
protected Cursor doInBackground(Integer... params) {
try {
return repository.queryForPlayersCursor(position, fantasyLeague, fantasyTeam);
} catch (SQLException e) {
Log.e("QueryPlayersTask", "Unable to query for players", e);
}

return null;
}

/* (non-Javadoc)
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(Cursor result) {
super.onPostExecute(result);

if(!isCancelled()) {
//Update the player cursor
updatePlayerCursor(result);
}
}
}

/**
* Updates the player cursor
* @param c the player cursor
*/
private final void updatePlayerCursor(Cursor c){
Log.d(TAG, "Updating player cursor.");
if(playerAdapter == null)
initializePlayerAdapter(c);
else
playerAdapter.changeCursor(c);

if(progressDialog != null) {
progressDialog.dismiss();
progressDialog = null;
}

//Clear the current task
currentTask = null;
}

@Override
public void onItemClick(AdapterView<?> adapter, View arg1, int listPosition, long id) {
Log.d(TAG, "[onItemClick] Clicked item "+position);
selectPlayer(listPosition);
}


}

任何帮助将不胜感激。我可以通过实现一些其他监听器并将其分配给每个列表项来获得所需的效果,但我认为这是正确的方法,它应该可以工作。我只是不知道为什么它没有

提前致谢。

最佳答案

如果您的布局中有一个项目可以从其他组件(如 CheckBox)窃取输入,则需要将该组件定义为不可聚焦。

关于android - ListFragment OnListItemClick 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7274231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com