[英]How do I setOnItemClickListener correctly in a non-activity class that populates a ListView from an Activity Class
我的ListView是根據用戶在非活動類中輸入EditText的內容從HashMap動態創建的。 我之所以認為它與setOnItemClickListener有關,是因為當我在OnCreate方法的Activity類中手動設置ListView值時,它可以工作。 非活動類包含用於AsyncTask和遞歸方法的幾個方法。
活動課
public class WordEntry extends AppCompatActivity implements OnClickListener, OnItemClickListener {
//Variable's Declared
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.word_entry);
/*Code for reading values into HashMap here*/
btn_Resolve = (Button) findViewById(R.id.submit_word);
btn_Resolve.setOnClickListener(this);
//TODO Make list item's clickable.
spin_options = (Spinner) findViewById(R.id.spin_choose_resolver_type);
ArrayAdapter<CharSequence> spin_adapter = ArrayAdapter.createFromResource(this,
R.array.resolver_options, R.layout.simpler_spinner_item);
spin_adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
spin_options.setAdapter(spin_adapter);
lv_words = (ListView) findViewById(R.id.lv_word_display);
/*This following two lines were a test to see if manually setting the adapter worked, it did. */
//lv_words.setAdapter(spin_adapter);
//lv_words.setOnItemClickListener(this);
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.i("HelloListView", "You clicked item: " + parent + " at position: " + position);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.submit_word:
edt_WordEntry = (EditText) findViewById(R.id.word_entry_textbox);
word = edt_WordEntry.getText().toString().toLowerCase();
Pattern pattern = Pattern.compile("\\s");
Matcher matcher = pattern.matcher(word);
boolean space_found = matcher.find();
View hideKey = this.getCurrentFocus();
if (space_found) {
edt_WordEntry.setText(R.string.no_spaces_allowed);
} else {
ResolveWord fixAnagram = new ResolveWord(word, this,wordHashSet);
ResolveAllWords fixAnagramAll = new ResolveAllWords(word,this,wordHashSet);
/*The following two lines are two other methods that I tried during debugging to try get it working. Separately of course and this debugging was for when the spinner was set to something other than "Anagram's"*/
//fixAnagramAll.lv_words.setOnItemClickListener(new ResolveWord(word,this,wordHashSet));
//lv_words.setOnItemClickListener(new ResolveWord(word,this,wordHashSet));
if(spin_options.getSelectedItem().toString().equals("Anagram;s")) {
hideKeyboard(this);
fixAnagram.execute();
} else {
hideKeyboard(this);
fixAnagramAll.execute();
}
}
break;
default:
break;
}
}
非活動班
public class ResolveWord extends AsyncTask<Void, Integer, ArrayList<String>> implements OnItemClickListener {
/*Variable's Declared*/
public ResolveWord(String letters, Activity wordEntryContext, HashSet<String> passedHashSet) {
/*Variables initiated */
}
/*Some code.....*/
@Override
protected void onPostExecute(ArrayList<String> wordSuccess) {
/*Code which puts data into an arraylist so I can put into the array adadater that follows...*/
ArrayAdapter<String> adapter = new ArrayAdapter<>(thisContext,R.layout.lv_displaywrods_wordentry,
wordSuccess);
//Ways I tried to get the ListView clickable in the non-activity class...
lv_words.setAdapter(adapter);
//lv_words.setOnItemClickListener(new WordEntry());
//lv_words.setOnItemClickListener(this);
/*lv_words.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//I have a break point here to see if the string gets assigned during debugging after clicking a rowitem.
String x = "Test";
}
});*/
//This always returns false
boolean o = lv_words.hasOnClickListeners();
//This always returns true
boolean p = lv_words.isClickable();
}
在上面的代碼之上,我不久前還以為我解決了它,並在onCreate方法的活動類中創建了onItemClickListener
並使用getOnItemClickListener
分配了一個值,不久前我也進行了一些編輯。 然后,我通過構造函數將其傳遞給非活動類,但這也無法正常工作。
在AsyncTask
可以設置OnClickListeners
在onPostExecute
方法之一onPreExecute
方法。
您不能在doInBackground
方法中添加OnClickListener
或執行任何UI操作,因為您正在執行網絡操作。
因此,您可以設置OnClickListener
regullary:
lv_words.setOnClickListener(new OnClickListener() {
@Override
public void onClick() {
// Do some coding...
}
});
在幕后,ArrayAdapter使用提供給它的ArrayList(或數組)中每個條目的toString()方法,並填充在您使用的構造函數的第二個參數中指定的布局。
如果wordSuccess數組列表不為空,則該條目到此布局的映射失敗。 ArrayAdapter希望將TextView或其派生類作為該構造函數中的第二個參數。 您的lv_displaywords_wordentry布局文件可能不是簡單的TextView,或者它包含用某種ViewGroup容器包裝的TextView。 由於您顯示的是簡單列表項,因此建議您使用android.R.layout.simple_list_item_1,如果數組列表不為空,則應該會看到顯示的單詞。
編輯:
就像我猜到的那樣,從注釋中可以理解,您正在嘗試將解析為布局的布局傳遞給ArrayAdapter中的ListView而不是TextView。 您可以正常使用ListView,但是適配器無法將數組列表中的String條目映射到ListView對象(因為ListView代表整個集合,而映射是一對一進行的)。 這就是為什么您需要傳遞TextView(或其自定義子類或它的變體)的原因。 使用android提供的列表項布局,您應該獲得標准的TextView。
您可以嘗試為ResolveWord設置傳承程序,以將WordEntry對象-wordEntry傳遞給ResolveWord,然后在onPostExecute(...)中編寫: lv_words.setOnItemClickListener(wordEntry);
很難理解您,但是我認為您將要存檔以下內容:
public class ResolveWord extends AsyncTask<Void, Integer, ArrayList<String>> {
private Activity wordEntryContext;
public ResolveWord(String letters, Activity wordEntryContext, HashSet<String> passedHashSet) {
this.wordEntryContext = wordEntryContext;
/*Other variables initiated */
}
@Override
protected void onPostExecute(ArrayList<String> wordSuccess) {
// your code
lv_words.setOnItemClickListener((OnItemClickListener)wordEntryContext);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.